【问题标题】:Extend behaviour from model in shared code folder从共享代码文件夹中的模型扩展行为
【发布时间】:2014-10-10 11:34:33
【问题描述】:

我的项目目录中有一个common 文件夹,其中包含我们在项目之间共享的一些类(此时我们不能选择使用其他技术作为引擎)。我们在此文件夹中“复制”了项目结构,因此我们有一些路径,如common/app/modelscommon/lib 等)。加载我们正在使用的所有模型:

config.autoload_paths += %W(
  #{config.root}/common/app/models
  #{config.root}/lib
)

但现在我需要以某种方式扩展 common/app/models 文件夹中的类的行为。

我的第一个选择是在常规应用程序模型文件夹中创建一个新的 ExtendedModel,从 SharedModel 继承,将记录迁移到新模型,然后将 ExtendedModel = SharedModel 之类的东西放在初始化程序中。它会起作用,但似乎有点棘手。

我的第二个选择是在应用程序模型文件夹中创建一个具有相同名称 SharedModel 和不同方法的新模型,但 Rails 似乎忽略了这个模型,它只使用了 SharedModel

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

【问题讨论】:

  • Ruby 允许您动态扩展类,所以这应该没有问题。所以,我的建议是进入命令行(rails c)加载你的模型扩展定义,并检查一个新实例是否会有这个新方法。
  • 这对我来说听起来过于复杂。另外,自动加载部分与此有什么关系?不只是继承和混合吗?
  • @tomsoft 这个我已经试过了,方法没有加载。我找到了解决方法,我会回答我的问题。
  • @phoet 我需要这个,因为我使用的是不同的模型目录。

标签: ruby-on-rails ruby ruby-on-rails-3


【解决方案1】:

我终于找到了某种解决方案,虽然我不能认为这是一个非常令人满意的解决方案:(。

我在app/models 中添加了一个shared_model.rb 文件,内容如下:

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

然后我添加了一个带有内容的初始化器:

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

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

【讨论】:

  • 这比任何其他猴子补丁更好吗?为什么要加载文件而不是将其放入某个自动加载的文件夹中?你会用这个来阻止类加载。
  • @phoet 因为它可以工作,并且避免将所有代码放入初始化程序中。将具有覆盖行为的类放在 app/models 文件夹中不起作用,至少对我来说是这样。你的建议到底是什么? :)
猜你喜欢
  • 1970-01-01
  • 2015-11-20
  • 2018-01-13
  • 2016-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-15
  • 1970-01-01
相关资源
最近更新 更多