Overring eine Rails-Kern mixin Methode, und immer noch die alte Methode aufrufen zu können,
-
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?
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.