从Rails 3插件中重新打开自动加载的类?

时间:2010-10-19 20:18:07

标签: ruby-on-rails ruby ruby-on-rails-3 autoload

我有一个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。

1 个答案:

答案 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

但是,我不确定是否可以在开发模式下自动重新加载插件,它们通常仅在您以开发模式重新启动服务器时重新加载。