Rails扩展模型而不修改基本文件

时间:2011-04-14 22:45:29

标签: ruby-on-rails

我有两个Rails 2.3应用程序,我们称之为 admin 前端。在 admin 中,我在app/models中指定了所有模型。在前端中,我将这些模型符号链接。我想将前端特定方法添加到仅显示前端应用程序的模型,而不是 admin 应用程序。

首先,我尝试将config.autoload_paths += "#{RAILS_ROOT}/app/augments/address.rb"添加到:

class Address
  def hello
    "hello world"
  end
end

但那只是没有加载。 Address.first.hello将会遇到undefined method 'hello'的来电。

如果我需要一个执行此操作的文件:

Address.class_eval do
  def hello
    "hello world"
  end
end

它被加载一次,并且对于开发中的第一次命中它可以工作,但是所有后续重新加载都失败了。这是由于config.cache_classes = false正在开发中。

半工作解决方案是从ApplicationController运行它:

class ApplicationController < ActionController::Base
  Address.class_eval do
    def hello
      "hello world"
    end
  end
end

每次在dev andprod中重新加载和工作,但对脚本/运行器或脚本/控制台不起作用。 (如果这是唯一的解决方案,我确信我们可以将其提取到模块中,并在ApplicationController中提取include ModelExtensions。)

我是否可以添加到environment.rb或初始化程序中,每次开发时都会重新加载?

1 个答案:

答案 0 :(得分:0)

要扩展课程,您应使用模块并将其包含在模型中。像这样:

module  Address
  def hello
    "hello world"
  end
end

这是关于该论点的一篇陈旧但总是令人兴奋的文章:http://weblog.jamisbuck.org/2007/1/17/concerns-in-activerecord

要仅在前端包含模块,您应该检查模块是否存在:

Class A
  include Address if defined? Address
end