Подтвердить что ты не робот

Почему в модели Rails отсутствует ошибка alias_method

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

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

4b9b3361

Ответ 1

ActiveRecord использует method_missing (AFAIK через ActiveModel::AttributeMethods#method_missing) для создания методов доступа к атрибутам и мутаторам в первый раз их называют. Это означает, что нет метода langEN, когда вы вызываете alias_method и alias_method :name, :langEN с ошибкой "undefined". Выполнение псевдонимов явно:

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, и при необходимости создаст соответствующие псевдонимы.