Overring eine Rails-Kern mixin Methode, und immer noch die alte Methode aufrufen zu können,

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

  •  06-07-2019
  •  | 
  •  

Frage

Ok Titel ist verwirrend, Ill Ihnen sagen, mein Problem zuerst:

die polymorphic_url Methode wurde in Rails 2.2.1 enthält einige zusätzliche Funktionen geändert ich brauche. Allerdings mag ich die Anwendung noch in älteren Versionen von Rails machen arbeiten, also wollte ich auf dem 2.2.1 Verhalten patchen, wenn eine älteren Rails-Version ausgeführt wird.

alias_method_chain zur Rettung nicht wahr? Ich kann es an die Arbeit.

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

Jetzt habe ich versucht, zuerst das in den Helfern setzen - alias_method_chain schlägt fehl, weil polymorphic_url ist nicht durch dann definiert. Also zog ich den gleichen Code in die Steuerung, und es tut Fehler, aber es ignoriert wird. Dann versuchte ich es in Applicationcontroller :: Base mit einem Plugin Patchen -. polymorphic_url ist noch nicht definiert

polymorphic_url wird in der Modulaction :: PolymorphicRoutes definiert. Ich weiß wirklich nicht, wann / wo es in den Controller / Ansicht gemischt wird.

Wie kann ich diese Methode in der Art und Weise wickeln ich will?

War es hilfreich?

Lösung

Bevor wir fortfahren, sind Sie sicher, dass polymorphic_url in Rails-Version existierte vor 2.2.1?

Sie sind Code ist meistens richtig, Sie vergessen die ursprüngliche Version des Verfahrens zu nennen. Welche polymorphic_url_without_compat nach dem alias_method_chain Aufruf umbenannt wird.

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

Sie haben erwähnt, Sie es zu einem Plugin hinzuzufügen versucht, so dass die folgenden nicht notwendig sein kann, wenn das vorherige Bit Ihr Problem behoben.

Der beste Weg, es wird geladen, nachdem die Schienen Kern zu gewährleisten, ist es in ein Plugin zu machen.

$ script/generate plugin polymorphic_url_backport

Wird ein Plugin Stub erstellen. Alle Richtungen ab diesem Zeitpunkt sind für das erstellte Plugin-Verzeichnis.

Im init.rb hinzufügen

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

Dann den obigen Code in Ihre lib einfügen / 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  

So stellen Sie sicher, dass die Plug-Schiffe mit Ihrer Anwendung und sollte es keine Probleme geben. Man könnte dies auf die lib Ihrer Schienen Wurzel abwechselnd addieren, aber ich bin nicht sicher, wo genau Sie würden platzieren Sie den Code benötigen sie zur richtigen Zeit zu laufen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top