class Country < ActiveRecord::Base
#alias_method :name, :langEN # here fails
#alias_method :name=, :langEN=
#attr_accessible :name
def name; langEN end # here works
end
在第一次通话alias_method
失败时:
NameError: undefined method `langEN' for class `Country'
我的意思是当我执行Country.first
时失败。
但是在控制台中我可以成功呼叫Country.first.langEN
,并看到第二个呼叫也有效。
我错过了什么?
答案 0 :(得分:50)
ActiveRecord使用method_missing
(AFAIK via ActiveModel::AttributeMethods#method_missing
)在第一次调用时创建属性访问器和mutator方法。这意味着当您调用alias_method
并且langEN
因“未定义方法”错误而失败时,没有alias_method :name, :langEN
方法。明确地进行别名:
def name
langEN
end
有效,因为首次尝试调用时,langEN
方法会被创建(method_missing
)。
Rails提供alias_attribute
:
你可以使用alias_attribute(new_name,old_name)
允许您为属性创建别名,包括getter,setter和query方法。
:
alias_attribute :name, :langEN
内置method_missing
将了解使用alias_attribute
注册的别名,并根据需要设置相应的别名。