0

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

4

1 回答 1

0

插件可以覆盖先前定义的任何类的早期定义的一种好方法(您的库或 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

我之前使用这种方法编写插件并重载活动记录

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

于 2010-10-20T00:08:52.767 回答