假设我有一个 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(使用前将#替换为@)