2014-10-10 34 views
-1

我在我的项目目录中有一个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

任何想法,将不胜感激:)

+0

Ruby允许你动态地扩展类,所以不应该有这个问题。所以,我的建议是进入命令行(rails c)加载你的模型扩展定义,并检查一个新的实例是否有这个新的方法。 – tomsoft 2014-10-10 12:20:57

+0

这听起来对我来说过于复杂。此外,自动加载部分与此有什么关系?不是关于继承和混搭吗? – phoet 2014-10-10 13:06:13

+0

@tomsoft我已经试过这个,并且该方法没有加载。我找到了解决方法,我会回答我的问题。 – 2014-10-11 09:18:40

回答

-1

最后我赶到某种解决办法,虽然我不能认为这是一个非常令人满意的一个:(。

我加了一个shared_model.rb文件app/models与以下内容:

SharedModel.class_eval do 
    def overriden_method 
    puts 'hi!' 
    end 
end 

然后,我添加了内容的初始化:

load('app/models/shared_model.rb'). 

我正在做更多的测试,但似乎工作。

+0

这比其他任何猴子补丁更好吗?你为什么要加载文件,而不是把它放到一个自动加载的文件夹中?你会用这个刹车类加载。 – phoet 2014-10-11 22:06:22

+0

@phoet因为它有效,并避免将所有代码放入初始化程序。至少对我而言,将带有重写行为的类放在app/models文件夹中不起作用。你的建议是什么? :) – 2014-10-12 09:52:47