ruby on rails - Por qué alias_method falla en el modelo de Rails
ruby-on-rails activerecord (1)
class Country < ActiveRecord::Base
#alias_method :name, :langEN # here fails
#alias_method :name=, :langEN=
#attr_accessible :name
def name; langEN end # here works
end
En la primera llamada, alias_method
falla con:
NameError: undefined method `langEN'' for class `Country''
Quiero decir que falla cuando hago, por ejemplo, Country.first
.
Pero en la consola puedo llamar Country.first.langEN
éxito, y ver que la segunda llamada también funciona.
¿Qué me estoy perdiendo?
ActiveRecord utiliza method_missing
(AFAIK a través de ActiveModel::AttributeMethods#method_missing
) para crear métodos de acceso de atributo y mutador la primera vez que son llamados. Esto significa que no hay langEN
método langEN
cuando llama a alias_method
y alias_method :name, :langEN
falla con su error de "método indefinido". Hacer el aliasing explícitamente:
def name
langEN
end
funciona porque el método langEN
se creará (por method_missing
) la primera vez que intente llamarlo.
Rails ofrece alias_attribute
:
alias_attribute (new_name, old_name)
Le permite crear alias para atributos, que incluye getter, setter y métodos de consulta.
que puedes usar en su lugar:
alias_attribute :name, :langEN
El method_missing
conocerá los alias registrados con alias_attribute
y configurará los alias apropiados según sea necesario.