Remplacer une méthode de mixage principale de Rails et pouvoir toujours appeler l'ancienne méthode

StackOverflow https://stackoverflow.com/questions/1620468

  •  06-07-2019
  •  | 
  •  

Question

Ok le titre est déroutant, je vais d'abord vous dire mon problème:

la méthode polymorphic_url a été modifiée dans Rails 2.2.1 pour inclure certaines fonctionnalités supplémentaires dont j'ai besoin. Cependant, je souhaite que l'application fonctionne toujours dans les anciennes versions de Rails. Je voulais donc appliquer un correctif au comportement de la version 2.2.1 si une version plus ancienne de Rails est en cours d'exécution.

alias_method_chain à la rescousse? Je n'arrive pas à le faire fonctionner.

def polymorphic_url_with_compat(*args)
  whatever...
  return polymorphic_url(*args)
end
alias_method_chain :polymorphic_url, :compat

Maintenant, j'ai d'abord essayé de placer ceci dans l'aide - alias_method_chain échouait car polymorphic_url n'était pas défini à ce moment-là. Donc, j'ai déplacé le même code dans le contrôleur, et il ne fait pas d'erreur, mais il est ignoré. Ensuite, j'ai essayé de le corriger dans ApplicationController :: Base avec un plugin - polymorphic_url n'est toujours pas défini.

polymorphic_url est défini dans le module ActionController :: PolymorphicRoutes. Je ne sais pas vraiment quand / où il est mélangé dans le contrôleur / vue.

Comment puis-je envelopper cette méthode comme je le souhaite?

Était-ce utile?

La solution

Avant de continuer, êtes-vous sûr que polymorphic_url existait dans la version de Rails antérieure à 2.2.1?

Votre code est généralement correct, vous oubliez d'appeler la version d'origine de la méthode. Qui est renommé polymorphic_url_without_compat après l’appel alias_method_chain.

class ActiveRecord::PolymorphicRoutes
  def polymorphic_url_with_compat(*args)
    whatever...
    return polymorphic_url_without_compat(*args)
  end
  alias_method_chain :polymorphic_url, :compat
end

Vous avez mentionné que vous avez essayé de l'ajouter à un plugin. Ce qui suit peut ne pas être nécessaire si le bit précédent corrigeait votre problème.

Le meilleur moyen de vous assurer qu'il est chargé après le coeur de rails est de le transformer en plugin.

$ script/generate plugin polymorphic_url_backport

va créer un talon de plugin. Toutes les instructions à partir de ce point sont pertinentes pour le répertoire de plug-in créé.

Dans le fichier init.rb, ajoutez

if RAILS_GEM_VERSION < "2.2.1"
  require File.dirname(__FILE__) + '/lib/yournamespace'
  ActionController::PolymorphicRoutes.send(:include, YourNameSpace::ActionController::PolymorphicRoutes) 
end

Collez ensuite le code ci-dessus dans votre lib / yournamespace.rb

module YourNameSpace
  class ActiveRecord::PolymorphicRoutes
    def included(base)
      base.class_eval %~
        def polymorphic_url_with_compat(*args)
          whatever...
          return polymorphic_url_without_compat(*args)
        end
        alias_method_chain :polymorphic_url, :compat
      ~
    end
  end
end  

Assurez-vous simplement que le plug-in est livré avec votre application et il ne devrait y avoir aucun problème. Vous pouvez également ajouter ceci à la bibliothèque de votre rails root, mais je ne sais pas exactement où vous placeriez le code requis pour l'exécuter au bon moment.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top