25
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成功调用,并且看到第二个调用也有效。

我错过了什么?

4

1 回答 1

56

ActiveRecord 使用method_missing(AFAIK via ActiveModel::AttributeMethods#method_missing)在第一次被调用时创建属性访问器和修改器方法。这意味着langEN当您调用alias_methodalias_method :name, :langEN因“未定义方法”错误而失败时没有方法。显式地进行别名:

def name
  langEN
end

有效,因为该langEN方法将在method_missing您第一次尝试调用它时(由)创建。

Rails 提供alias_attribute

别名属性(新名称,旧名称)

允许您为属性创建别名,包括 getter、setter 和查询方法。

您可以改用它:

alias_attribute :name, :langEN

内置method_missing将了解注册alias_attribute的别名,并将根据需要设置适当的别名。

于 2013-05-24T05:41:31.340 回答