在 Rails 中扩展 ruby​​ gem

2024-04-23

假设我有一个 Rails 应用程序,它从 gem(例如 CMS)获取大部分功能。

如果我现在需要添加一些自定义(例如,向用户添加属性),最佳实践方法是什么?如果我自定义 gem,那么将来更新 gem 时将会遇到问题。

这里采取的最佳方法是什么?


这个问题很老了,但我觉得它需要更多的充实。确实,您可以在运行时对rails(和ruby)进行monkeypatch。这意味着可以轻松地重新打开类或模块并注入新代码。然而,由于在开发模式下进行所有动态类加载和卸载,这在 Rails 中有点棘手。

我不会详细介绍,但您确实希望将扩展放入初始化程序或 gem 中,因为它们会在开发模式下的请求之间重新加载。如果您将代码放入插件中,它将不会重新加载,并且您会收到非常神秘的错误,例如“XXX 的副本已从模块树中删除,但仍然处于活动状态!”

最简单的方法是将代码放入初始化程序中(例如 config/initializers/user_extensions.rb)。您可以只使用 class_eval 来注入代码。

User.class_eval do
  ... new code ...
end

ruby 的可扩展性的一个主要缺点是追踪代码的来源。您可能想要添加某种有关正在加载的扩展的日志消息,以便人们可以跟踪它。

Rails.logger.info "\n~~~ Loading extensions to the User model from #{ __FILE__ }\n"
User.class_eval do
  ... new code ...
end

进一步阅读:

http://airbladesoftware.com/notes/monkey-patching-a-gem-in-rails-2-3 http://airbladesoftware.com/notes/monkey-patching-a-gem-in-rails-2-3

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Rails 中扩展 ruby​​ gem 的相关文章

  • 为 Ruby/Rails 动态更改 iTerm2 选项卡标题

    我使用的是 iTerm2 通常会打开许多 选项卡 不幸的是 所有选项卡都显示相同的标题 ruby 因为它都是 ruby 脚本 但一个是rails服务器 另一个是rails控制台 下一个是 spork 我想将选项卡标题动态设置为 服务器 控制
  • 如何在 Rails 4 中“link_to”完整路径?

    这是我的代码 a a 从上面
  • 将类添加到 link_to 会破坏链接

    我在 RoR 3 中使用 link to 当我像这样使用它时 它工作得很好 但我也想通过一门课 但是 这对我不起作用 该类有效 但它破坏了链接 有任何想法吗
  • 如何用载波发送文件给用户?

    这是我将文件发送到浏览器的旧代码 def show send file File join Rails root tmp price xls end 但最近我发现 tmp 文件夹不能用作 Heroku 上的持久存储 因此我决定将文件移动到
  • 在单选按钮选择上提交 Rails 表单

    我有以下 Rails 表单 有效 但我想删除 Submit tag 并在选择单选按钮后立即提交表单 我怎么做 p nbsp nbsp p p p 所以我找到了精确的解决方案 感谢输入人员 它帮助我重新定义了我的谷歌搜索
  • ASP.NET MVC 或 Ruby On Rails 哪个更快 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 为什么 Capistrano 部署在资产:预编译时失败而没有错误?

    我已经尝试了我能想到的一切 但我无法让部署工作 该应用程序需要部署到由Alwaysdata托管并运行ruby 2 6 2的VPS 使用Capistrano进行部署 这是一个 Rails 6 0 2 2 应用程序 使用 webpack 处理
  • 如何设置和获取Redis中存储的对象?

    我试图在 redis 中存储一个对象 当我获取该对象时 它似乎不起作用 I tried u User new u name blankman redis set test u x redis get test x name error 我想
  • Rails 命名空间与嵌套资源

    假设我的应用程序有两个模型 Foo 和 Bar Foo 可选地属于 Bar 现在我可以查看单个 Foo 或者搜索特定的 Foo FoosController 会处理所有这些 我的网址是这样的 foos 1 and foos new 有时我想
  • Rails:如何测试 lib/ 目录中的代码?

    我有一个从解析器对象获取数据的模型 我认为解析器类应该位于 lib 目录中 尽管我可以说服它应该位于其他地方 问题是 解析器类的单元测试应该在哪里 如何确保每次运行 rake 测试时都运行它们 在我正在开发的 Rails 应用程序中 我决定
  • rspec 不适用于设计用户身份验证

    我正在尝试使用 RSpec 来测试我的 Rails 应用程序 该应用程序使用设计用户身份验证 gem 以下是已捆绑的相关 gem 的列表 devise 3 4 1 rails 4 1 7 4 1 6 rspec 3 1 0 rspec co
  • gem 如何提供 Cucumber 功能和步骤定义?

    我有两个 Rails 项目 A 和 B 其中包含以下宝石 project A gem green theme path gt dev themes green theme gem devel tasks path gt dev themes
  • ActiveSupport 如何计算月度总和?

    我很高兴也很惊讶地发现 ActiveSupport 按照我想要的方式进行月度汇总 无论相关月份中有多少天 添加1 month对特定的Time将使您在该月的同一天着陆Time gt Time utc 2012 2 1 gt Wed Feb 0
  • 机架 1.3.2 的问题。您已经激活了机架 1.3.2,但您的 Gemfile 需要机架 1.2.3

    我在 Debian 上有 Passenger 3 0 9 带有 Gem Rack 1 3 2 和 1 2 1 使用带有乘客 e 捆绑器的 Rails 3 0 应用程序 我遇到以下错误 您已经激活了机架 1 3 2 但您的 Gemfile 需
  • Paperclip 会自动清理文件名吗?

    我正在使用 Thoughtbot回形针宝石 https github com thoughtbot paperclip处理文件上传 我发现当我上传文件名中包含空格的文件时 它会用下划线替换空格来存储 那挺好的 我还尝试上传带有特殊字符的文件
  • 如何在 Ruby on Rails 中向 select_tag 添加类

    难以为此添加类标签 div class field div 这是我尝试过的 除其他外 div class field div
  • 您推荐使用哪些工具来分析 Rails 应用程序? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我一直在寻找 Rails 的分析工具 我目前正在玩和测试 ruby prof 和 Railsbench 但我对使其工作所需的大量调整和修改
  • 如何让 Rails 资产管道生成源地图?

    我想让 Rails 与编译后的 CoffeeScript 缩小的 JS 一起生成源映射 以便更好地记录错误 不过 网上似乎还没有关于如何执行此操作的全面文档 有人这样做过吗 我使用 Rails 3 2 和 Heroku Rails 支持缩小
  • 为铁路中的自引用关联建立工厂

    我有一个典型的要求 我必须按如下方式处理用户对象 user referrer and user referrers 基本上 用户可以推荐多个人 并且一个人应该由一位特定用户推荐 所以我按如下方式建立关联 他们工作得很好 class User
  • ruby 调试和黄瓜

    我在 Cucumber 中遇到了失败的情况 我想使用 ruby debug 来调试我的 Rails 控制器 但是 如果我将 调试器 添加到我想要中断的位置 它就不会停止 我尝试将 ruby debug 和 ruby gems 的 requi

随机推荐