2010-10-19 58 views
0

我有一个Rails 3应用程序,它定义了一些像普通类一样的类。我试图找出如何重新打开插件中的其中一个类(由“rails generate plugin ...”生成),并自动将这两个文件(应用程序本身中的文件和插件中的文件)自动在开发模式下重新加载每个请求。从Rails 3插件中重新打开自动加载的类?

一个简单的例子是:

# 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 %> 

当这一观点被渲染,我得到一个错误,自行车::插件是初始化。我已经将root/lib和root/vendor/plugins/plugin1/lib添加到了我的autoload_paths中(理想情况下,插件会将其添加到init.rb或类似的地方,但每次只能添加一个)。

我该如何解决这个问题? autoload_at类似看起来可能会有所帮助,如果我可以告诉它自动加载来自两个位置的Person类,但我没有任何运气(虽然我对它完全陌生,所以我可能会传递错误的参数,等等)。最后我想用标准位置(特别是模型)中定义的类来做到这一点,而不仅仅是lib。

回答

0

一个好办法先前定义的任何类(你的库或者轨道内部等)的插件可以覆盖以前的定义:

#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

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

+0

感谢您的想法。它似乎没有为我工作,我认为是因为root/lib/person.rb定义了Person类并被自动加载。供应商/插件/ plugin1/lib/person.rb根本没有被加载。 – 2010-10-20 14:11:00

+0

你有一个'vendor/plugins/plugin1/plugin1.rb'文件,其中包含'require'person''这样的行,我认为插件是通过匹配'vendor/plugins/*。rb'的文件加载的对于一个多文件插件,你通常在基础上有一个rb文件,它需要所有其他目录下的文件等。 – Jeremy 2010-10-21 03:44:26

+0

是的,但是如果我需要该文件的供应商/插件/ plugin1/lib/person.rb,在person.rb中只对第一个请求存在。我认为这是因为app/lib/person.rb是自动加载的,它会在每个新请求中删除并重新定义Person常量,然后再次加载插件中的person.rb。 – 2010-10-22 14:47:24

相关问题