web-dev-qa-db-ja.com

alias_methodがRailsモデルで失敗する理由

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を正常に呼び出すことができ、2番目の呼び出しも機能することがわかります。

何が足りないのですか?

24
sites

ActiveRecordは method_missing (AFAIK via ActiveModel::AttributeMethods#method_missing )を使用して、最初に呼び出されたときに属性アクセサーメソッドとミューテーターメソッドを作成します。つまり、 alias_method を呼び出すと、langENメソッドがなく、alias_method :name, :langENが「undefinedmethod」エラーで失敗します。エイリアシングを明示的に行う:

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に登録されているエイリアスを認識し、必要に応じて適切なエイリアスを設定します。

54
mu is too short