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

私は何が欠けていますか?

4

1 に答える 1

56

ActiveRecord はmethod_missing(AFAIK via ActiveModel::AttributeMethods#method_missing) を使用して、最初に呼び出されたときに属性アクセサーとミューテーター メソッドを作成します。つまり、langEN呼び出し時にメソッドがなく、「未定義のメソッド」エラーalias_methodで失敗することを意味します。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し、必要に応じて適切なエイリアスを設定します。

于 2013-05-24T05:41:31.340 に答える