ruby-on-rails ruby alias

ruby on rails - ¿Es alias_method_chain sinónimo de alias_method?



ruby-on-rails (2)

Si estos dos métodos son simplemente sinónimos, ¿por qué la gente se _chain la molestia de escribir los caracteres adicionales " _chain "?


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 alias_method_chain un alias del método antiguo con un nuevo nombre y luego un nuevo método al nombre original. Entonces, si, por ejemplo, está creando una nueva versión del method método con la nueva característica 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

Este es un ejemplo hipotético: supongamos que tenemos una clase de persona con un método para 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 están en mayúsculas 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


alias_method_chain es la peor forma de interceptar llamadas de método. Si está buscando técnicas similares, no las utilice fuera de los rieles.