¿Es alias_method_chain sinónimo de alias_method?
-
06-07-2019 - |
Pregunta
Si estos dos métodos son simplemente sinónimos, ¿por qué la gente se toma la molestia de escribir los caracteres adicionales " _chain
" ;?
Solución
No. alias_method
es un método estándar de Ruby. alias_method_chain
es un complemento de Rails diseñado para simplificar la acción común de aliasar el método antiguo a un nuevo nombre y luego aliasar un nuevo método al nombre original. Entonces, si por ejemplo está creando una nueva versión del método method
con la nueva función new_feature
, los siguientes dos ejemplos de código son equivalentes:
alias_method :method_without_new_feature, :method
alias_method :method, :method_with_new_feature
y
alias_method_chain :method, :new_feature
EDITAR
Aquí hay un ejemplo hipotético: supongamos que tenemos una clase Person con un método rename
. Todo lo que hace es tomar una cadena como '' John Doe '', dividir en el espacio y asignar partes a first_name y last_name. Por ejemplo:
person.rename("Steve Jones")
person.first_name #=> Steve
person.last_name #=> Jones
Ahora estamos teniendo un problema. Seguimos recibiendo nuevos nombres que no se capitalizan correctamente. Entonces podemos escribir un nuevo método rename_with_capitalization
y usar alias_method_chain
para resolver esto:
class Person
def rename_with_capitalization(name)
rename_without_capitalization(name)
self.first_name[0,1] = self.first_name[0,1].upcase
self.last_name[0,1] = self.last_name[0,1].upcase
end
alias_method_chain :rename, :capitalization
end
Ahora, el antiguo rename
se llama rename_without_capitalization
, y rename_with_capitalization
es rename
. Por ejemplo:
person.rename("bob smith")
person.first_name #=> Bob
person.last_name #=> Smith
person.rename_without_capitalization("tom johnson")
person.first_name #=> tom
person.last_name #=> johnson
Otros consejos
alias_method_chain
es la peor forma de interceptar llamadas de método. Si está buscando técnicas similares, no lo use fuera de los rieles.