我有两个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或初始化程序中,每次开发时都会重新加载?
答案 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