假设我有一个Rails应用程序,其大部分功能都来自于一个gem(例如CMS)。
现在如果我需要添加一些自定义内容(例如,为用户添加属性),最佳实践是什么?如果我对gem进行定制,则将来更新gem时会遇到问题。
如何处理这种情况是最佳的方法?
现在如果我需要添加一些自定义内容(例如,为用户添加属性),最佳实践是什么?如果我对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