Question Ruby on Rails: alias_method_chain, que fait-il exactement?


J'ai essayé de lire divers articles de blog qui tentent d'expliquer alias_method_chain et les raisons de l'utiliser et de ne pas l'utiliser. En particulier, j'ai pris garde à:

http://weblog.rubyonrails.org/2006/4/26/new-in-rails-module-alias_method_chain

et

http://yehudakatz.com/2009/03/06/alias_method_chain-in-models/

Je ne vois toujours aucune utilisation pratique pour alias_method_chain. Quelqu'un pourrait-il expliquer quelques choses?

1 - est-il encore utilisé?
2 - Quand utiliseriez-vous alias_method_chain et pourquoi?


43
2017-09-12 17:43


origine


Réponses:


1 - est-il encore utilisé?

Apparemment oui, alias_method_chain() est encore utilisé dans les rails (à partir de la version 3.0.0).

2 - quand utiliseriez-vous   alias_method_chain et pourquoi?

(Remarque: ce qui suit est largement basé sur la discussion de alias_method_chain() dans Métaprogrammation rubis par Paolo Perrotta, un excellent livre que vous devriez mettre la main sur.


93
2017-09-13 01:16



Je ne suis pas sûr que le style de Rails 3 soit dépassé ou non, mais il est toujours utilisé dans les versions précédentes.

Vous l'utilisez pour injecter certaines fonctionnalités avant (ou après) qu'une méthode soit appelée, sans modifier aucun endroit qui appelle cette méthode. Voir cet exemple:

module SwitchableSmtp
  module InstanceMethods
    def deliver_with_switchable_smtp!(mail = @mail)
      unless logger.nil?
        logger.info  "Switching SMTP server to: #{custom_smtp.inspect}" 
      end
      ActionMailer::Base.smtp_settings = custom_smtp unless custom_smtp.nil?
      deliver_without_switchable_smtp!(mail = @mail)
    end
  end
  def self.included(receiver)
    receiver.send :include, InstanceMethods
    receiver.class_eval do
      alias_method_chain :deliver!, :switchable_smtp
    end
  end
end

C’est un ajout à ActionMailer pour permettre le remplacement des paramètres SMTP lors de chaque appel à deliver!. En appelant alias_method_chain vous êtes capable de définir une méthode deliver_with_switchable_smtp! dans lequel vous faites votre truc personnalisé, et appelez deliver_without_switchable_smtp! à partir de là quand vous avez terminé.

alias_method_chain alias l'ancien deliver! à votre nouvelle méthode personnalisée, donc le reste de votre application ne sait même pas deliver! maintenant fait votre truc personnalisé aussi.


4
2017-09-12 17:57



alias_method_chain a été déconseillé dans Rails 5 en faveur de Module#prepend.

Demande de tirage: https://github.com/rails/rails/pull/19434

Changelog: https://github.com/rails/rails/blob/b292b76c2dd0f04fb090d49b90716a0e6037b41a/guides/source/5_0_release_notes.md#deprecations-4


3
2018-01-18 09:56



est-il utilisé du tout?

Semble si. C'est une pratique courante chez les développeurs de Rails

Quand utiliseriez-vous alias_method_chain et pourquoi?

Malgré les avertissements, alias_method_chain reste la principale stratégie utilisée lors de l’injection de fonctionnalités dans une méthode existante, du moins dans Rails 2.x, suivie par de nombreuses personnes qui l’étendent. Yehuda devrait supprimer alias_method_chain de rails 3.0 pour le dire de ses posts et commentaires dans les tickets Rails. Il est encore utilisé par de nombreuses extensions qui ajoutent un comportement personnalisé à certains points de l'exécution, tels que les enregistreurs, les rapporteurs d'erreurs, l'analyse comparative, l'injection de données, etc.

IMO, la meilleure alternative est d'inclure un module, vous avez donc une décoration sur la délégation. (Par exemple, suivez l'exemple 4 dans ce post). De cette façon, vous pouvez modifier les objets, même individuellement, si vous le souhaitez, sans polluer les méthodes de la classe. L'inconvénient est que la chaîne de recherche de méthode augmente pour chaque module que vous injectez, mais c'est ce à quoi servent les modules.

Question très intéressante, gardera un œil sur ce que les autres en pensent.


2
2017-09-13 02:54