繁体   English   中英

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

[英]Reopen autoloaded class from within a Rails 3 plugin?

我有一个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或类似的位置中,但一次添加一件事)。

我该怎么办? 如果我可以告诉它从两个位置显式自动加载Person类,但autoload_at看起来可能会有所帮助,但是我没有任何运气(尽管我是个新手,所以我可能传递了错误的参数,等等。 )。 最后,我想使用在标准位置(尤其是模型)中定义的类(而不只是lib)来完成此操作。

插件可以为先前定义的任何类(您的库或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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM