我有一个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。
感谢您的想法。它似乎没有为我工作,我认为是因为root/lib/person.rb定义了Person类并被自动加载。供应商/插件/ plugin1/lib/person.rb根本没有被加载。 – 2010-10-20 14:11:00
你有一个'vendor/plugins/plugin1/plugin1.rb'文件,其中包含'require'person''这样的行,我认为插件是通过匹配'vendor/plugins/*。rb'的文件加载的对于一个多文件插件,你通常在基础上有一个rb文件,它需要所有其他目录下的文件等。 – Jeremy 2010-10-21 03:44:26
是的,但是如果我需要该文件的供应商/插件/ plugin1/lib/person.rb,在person.rb中只对第一个请求存在。我认为这是因为app/lib/person.rb是自动加载的,它会在每个新请求中删除并重新定义Person常量,然后再次加载插件中的person.rb。 – 2010-10-22 14:47:24