我有一个Rails 3应用程序,它定义了一些类似普通的类。我试图弄清楚如何在插件中重新打开其中一个类(由“rails generate plugin ...”生成),并自动拥有这两个文件(应用程序本身中的文件和插件中的文件)在开发模式下重新加载每个请求。
一个简单的例子是:
# root/lib/person.rb
class Person
Core = 1
end
# root/vendor/plugins/plugin1/lib/person.rb
class Person
Plugin = 2
end
# root/app/views/home/index.html.erb
<%= Person::Core %> ... <%= Person::Plugin %>
当呈现该视图时,我收到一条错误,即Bike :: Plugin未初始化。我已经将root / lib和root / vendor / plugins / plugin1 / lib添加到我的autoload_paths中(理想情况下,插件会在其init.rb或类似的地方添加它,但一次只能添加一件事。)
我该如何解决这个问题? autoload_at看起来有点像它可能会有所帮助,如果我可以告诉它从两个位置明确地自动加载Person类,但我没有任何运气(虽然我完全是新手,所以我可能会传递错误的参数,等等)。最后,我想用标准位置(特别是模型)中定义的类来做到这一点,而不仅仅是lib。
答案 0 :(得分:0)
一个好方法插件可以覆盖先前定义的任何类的早期定义(libs或rails内部等):
#vendor/plugins/myawesomeplugin/lib/person.rb
Person.class_eval do
Plugin = 2
# override methods here too if you want
def name
"hacked"
end
end
我之前使用过这种方法来编写插件overload active record
但是,我不确定是否可以在开发模式下自动重新加载插件,它们通常仅在您以开发模式重新启动服务器时重新加载。