在Rails中扩展一个ruby gem[英] Extending a ruby gem in Rails

本文是小编为大家收集整理的关于在Rails中扩展一个ruby gem的处理方法,想解了在Rails中扩展一个ruby gem的问题怎么解决?在Rails中扩展一个ruby gem问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

假设我有一个 Rails 应用程序,它的大部分功能来自 gem(例如,CMS).

如果我现在需要添加一些自定义项(例如,向用户添加属性),那么执行此操作的最佳做​​法是什么?如果我自定义了 gem,那么我以后在更新 gem 时会遇到问题.

这里最好的方法是什么?

推荐答案

这个问题有点老了,但我觉得它可以再充实一点.确实,您可以在运行时对 rails(和 ruby​​)进行修补.这意味着很容易重新打开一个类或模块并注入新代码.但是,由于在开发模式下进行的所有动态类加载和卸载,这在 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

本文地址:https://www.itbaoku.cn/post/786498.html