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 

in prima convocazione alias_method fallisce con:Perché alias_method fallisce in Rails modello

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

voglio dire che non riesce quando lo faccio, per esempio Country.first.

Ma in console posso chiamare con successo Country.first.langEN e vedere che anche questa seconda chiamata funziona.

Cosa mi manca?

risposta

46

ActiveRecord utilizza method_missing (AFAIK tramite ActiveModel::AttributeMethods#method_missing) per creare i metodi di accesso e mutatore dell'attributo la prima volta che vengono chiamati. Ciò significa che non esiste un metodo langEN quando si chiama alias_method e alias_method :name, :langEN non riesce con l'errore "metodo non definito". Facendo l'aliasing in modo esplicito:

def name 
    langEN 
end 

opere perché verrà creato il metodo langEN (dal method_missing) la prima volta che si tenta di chiamare.

Rails offre alias_attribute:

alias_attribute (new_name, OLD_NAME)

Consente di effettuare gli alias per gli attributi, che comprende getter, setter, e metodi di query.

che è possibile utilizzare invece:

alias_attribute :name, :langEN 

Il built-in method_missing saprà sugli alias registrati alias_attribute e sarà istituito gli alias appropriati in base alle esigenze.