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番目の呼び出しも機能することがわかります。
何が足りないのですか?
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
に登録されているエイリアスを認識し、必要に応じて適切なエイリアスを設定します。