从共享代码文件夹中的模型扩展行为
我在我的项目目录中有一个common
文件夹,我们在项目之间共享某些类(使用其他技术作为引擎不是我们此时的选项)。我们在该文件夹中有“复制”项目结构,因此我们有一些路径,如common/app/models
,common/lib
等)。要加载所有的模型,我们使用:从共享代码文件夹中的模型扩展行为
config.autoload_paths += %W(
#{config.root}/common/app/models
#{config.root}/lib
)
但现在我需要以某种方式之一的行为对类扩展的common/app/models
文件夹中。
我的第一选择是在常规应用模型文件夹中创建一个新的ExtendedModel
,从SharedModel
继承,记录迁移到新的模型,然后将类似ExtendedModel = SharedModel
一个初始化内。它会工作,但似乎有点棘手。
我的第二个选择是在应用程序模型文件夹中创建一个新模型,其名称与SharedModel
和其他方法相同,但Rails似乎忽略了此模型,并且它仅使用了SharedModel
。
任何想法,将不胜感激:)
最后我赶到某种解决办法,虽然我不能认为这是一个非常令人满意的一个:(。
我加了一个shared_model.rb
文件app/models
与以下内容:
SharedModel.class_eval do
def overriden_method
puts 'hi!'
end
end
然后,我添加了内容的初始化:
load('app/models/shared_model.rb').
我正在做更多的测试,但似乎工作。
这比其他任何猴子补丁更好吗?你为什么要加载文件,而不是把它放到一个自动加载的文件夹中?你会用这个刹车类加载。 – phoet 2014-10-11 22:06:22
@phoet因为它有效,并避免将所有代码放入初始化程序。至少对我而言,将带有重写行为的类放在app/models文件夹中不起作用。你的建议是什么? :) – 2014-10-12 09:52:47
Ruby允许你动态地扩展类,所以不应该有这个问题。所以,我的建议是进入命令行(rails c)加载你的模型扩展定义,并检查一个新的实例是否有这个新的方法。 – tomsoft 2014-10-10 12:20:57
这听起来对我来说过于复杂。此外,自动加载部分与此有什么关系?不是关于继承和混搭吗? – phoet 2014-10-10 13:06:13
@tomsoft我已经试过这个,并且该方法没有加载。我找到了解决方法,我会回答我的问题。 – 2014-10-11 09:18:40