23
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 терпит неудачу с:Почему alias_method терпит неудачу в Rails модели

NameError: undefined method `langEN' for class `Country' 

Я имею в виду, что терпит неудачу, когда я, например, Country.first.

Но в консоли я могу позвонить Country.first.langEN успешно и увидеть, что второй звонок также работает.

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

ответ

46

ActiveRecord использует method_missing (AFAIK через 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 и будут созданы соответствующие псевдонимы по мере необходимости.