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 

W pierwszej rozmowy alias_method nie powiedzie się z:Dlaczego alias_method zawodzi w Rails modelu

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

Znaczy to zawiedzie, gdy robię na przykład Country.first.

Ale w konsoli mogę zadzwonić pod numer Country.first.langEN i zobaczyć, że drugie połączenie również działa.

Czego mi brakuje?

Odpowiedz

46

ActiveRecord używa method_missing (AFAIK przez ActiveModel::AttributeMethods#method_missing), aby utworzyć narzędzie do dostępu do atrybutów i metody mutatora przy pierwszym wywołaniu. Oznacza to, że nie ma metody langEN po wywołaniu alias_method i alias_method :name, :langEN z powodu błędu "nieokreślonej metody". Robi aliasing wyraźnie:

def name 
    langEN 
end 

ponieważ prace będą tworzone metodą langEN (przez method_missing) po raz pierwszy spróbować to nazwać.

Szyny oferuje alias_attribute:

alias_attribute (nowa_nazwa, OLD_NAME)

Pozwala na tworzenie aliasów dla atrybutów, które zawiera getter, setter i metod zapytania.

których można użyć zamiast:

alias_attribute :name, :langEN 

Wbudowany method_missing będzie wiedział o aliasów zarejestrowanych alias_attribute i ustanowi odpowiednie aliasy, ile potrzeba.

Powiązane problemy