Почему 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 и увидеть, что второй вызов также работает.

Что мне не хватает?


person sites    schedule 24.05.2013    source источник


Ответы (1)


ActiveRecord использует method_missing (насколько мне известно, через 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)

Позволяет создавать псевдонимы для атрибутов, включая методы получения, установки и запроса.

который вы можете использовать вместо этого:

alias_attribute :name, :langEN

Встроенный method_missing будет знать о псевдонимах, зарегистрированных в alias_attribute, и установит соответствующие псевдонимы по мере необходимости.

person mu is too short    schedule 24.05.2013