Ruby on rails 在Rails中扩展ruby gem

Ruby on rails 在Rails中扩展ruby gem,ruby-on-rails,rubygems,Ruby On Rails,Rubygems,比如说,我有一个Rails应用程序,它的大部分功能都来自于gem(例如CMS) 如果我现在需要添加一些定制(例如,向用户添加属性),那么最好的做法是什么?如果我定制gem,那么我在将来更新gem时会遇到问题 在这里最好的方法是什么?Ruby允许您在运行时扩展类,因此您可以在不接触源代码的情况下侵入库。否则,我建议您下载gem,在库中创建一些钩子,并将其作为补丁提交回去 更新: 请注意,这些自定义是特定于应用程序的 对。我的意思是以某种方式修改通用api,这样就可以定制每个应用程序。例如,允许用户

比如说,我有一个Rails应用程序,它的大部分功能都来自于gem(例如CMS)

如果我现在需要添加一些定制(例如,向用户添加属性),那么最好的做法是什么?如果我定制gem,那么我在将来更新gem时会遇到问题


在这里最好的方法是什么?

Ruby允许您在运行时扩展类,因此您可以在不接触源代码的情况下侵入库。否则,我建议您下载gem,在库中创建一些钩子,并将其作为补丁提交回去

更新:


请注意,这些自定义是特定于应用程序的


对。我的意思是以某种方式修改通用api,这样就可以定制每个应用程序。例如,允许用户将一个块传递给某些方法等。

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

我不会详细介绍,但您确实希望将扩展放入初始值设定项或gem中,因为它们在dev模式下的请求之间被重新加载。如果你将代码放入插件中,它将不会被重新加载,你会得到非常神秘的错误,例如“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
进一步阅读:


请注意,这些定制是特定于应用程序的,我正在尝试做一件非常类似的事情。我希望我有一个代码样本来解释如何做到这一点。伟大的答案,帮助了我!有一件事我想知道的是,这是否只是美学之间把。。。新代码。。。如上所述,与在config/initializers/user_extensions.rb中使用类似“require Rails.root.join”(“app”、“models”、“user”)”的内容,然后打开类并定义。。。新代码。。。在app/models/user.rb中。