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
,并看到第二次调用也有效。
我错过了什么?
ActiveRecord 使用 method_missing
(AFAIK via ActiveModel::AttributeMethods#method_missing
(在第一次调用它们时创建属性访问器和突变器方法。这意味着当您调用alias_method
并且alias_method :name, :langEN
失败并出现"未定义方法"错误时,没有langEN
方法。显式执行别名:
def name
langEN
end
之所以有效,是因为 langEN
方法将在您第一次尝试调用它时创建(由 method_missing
创建(。
Rails 提供alias_attribute
:
alias_attribute(new_name、old_name(
允许您为属性创建别名,其中包括 getter、setter 和查询方法。
您可以改用:
alias_attribute :name, :langEN
内置method_missing
将了解向alias_attribute
注册的别名,并根据需要设置适当的别名。