Überschreiben Sie Schienen Helfer mit Zugang zum original
Will ich mit rails' vertraut Helfer, aber mit leicht veränderten Funktionalität. Ich sehe das so, ich möchte in der Lage sein, etwas zu tun:
module AwesomeHelper
#... create alias of stylesheet_link_tag to old_stylesheet_link_tag
def stylesheet_link_tag(*args)
if @be_awesome
awesome_stylesheet_link_tag *args
else
old_stylesheet_link_tag *args
end
end
end
So wie ich es sehe, habe ich drei Optionen:
- Monkey-patching: Wiedereröffnung der rails-helper-Modul. Wenn die rails-team jemals ändern Sie die Namen Ihrer Helfer-Modul, mein code wird zu einer Quelle der Sprödigkeit. Nicht unüberwindbar, aber nicht ideal.
- Verwenden unterschiedliche Methodennamen: Versuchen zu kleben, um die common-Rail-Schnittstelle kann mein Untergang. Meine änderungen kann eine Quelle der Verwirrung für andere Entwickler
- Abnehmen-Methoden (neu): Nicht sicher, ob dies funktionieren würde, oder ob es die gleichen Nachteile wie 1. Wird diese Forschung, aber dies könnte ein guter Ausgangspunkt.
Also die Frage hier ist, bin ich stecken mit einem dieser sub-optimale Lösungen, oder gibt es eine andere Möglichkeit, die ich noch nicht berücksichtigt? Wenn ich mich für option 3, gibt es einen Weg, es zu tun, ohne die direkte Ansprache der rails-helper-Modul?
(Hinweis: ich habe entfernt den Kontext an, denn es fügt nichts zu der Frage.)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es einen besseren Weg als alle Ihre aufgeführten Optionen. Verwenden Sie einfach
super
:Überschreiben
stylesheet_link_tag
im AwesomeHelper wird sichergestellt, dass, wennstylesheet_link_tag
wird aufgerufen, Ruby wird ihm begegnen in der Methode lookup-Weg, bevor es trifftActionView::Helpers::AssetTagHelper
. Wenn@be_awesome
isttrue
bekommen Sie in die Hand nehmen und aufhören, die Dinge richtig es ist, und wenn nicht, wird der Anruf zusuper
ohne Klammern, transparent Durchlaufen alle Argumente bis zu den Schienen der Umsetzung. Auf diese Weise müssen Sie nicht zu befürchten, dass das Rails-core-team bewegt die Dinge um auf Sie!ApplicationController
kann Hilfe bei der Milderung Ihrer Anliegen.Ich nicht dieses Juwel, so werde ich die Antwort, die Sie in einer allgemeineren Art und Weise.
Lassen Sie uns sagen, Sie möchten, melden Sie Anrufe zu
link_to
Helfer (ja, erfundenes Beispiel, aber es zeigt die Idee). Suche in der API gibt Ihnen zu verstehen, dasslink_to
im inneren desActionView::Helpers::UrlHelper
Modul. So erstellen Sie eine Datei in Ihrem, sagen wir,config/initializers
- Verzeichnis mit folgendem Inhalt:Den Kern dieser Funktionalität --
alias_method_chain
(anklickbar). Verwenden Sie es NACH der Definition der Methodexxx_with_feature
.alias_method_chain
dann sollten Sie nicht: es existiert seit der version 1.4.0 (Jahr 2007). Wenn Sie sich sorgen über andere Teile des Programms werden dann sicher anständige tests Berichterstattung.Versuchen Sie es mit
alias_method
:Ich würde wirklich ermutigen, Sie zu erwägen, Ihre option #2, überschreiben das Verhalten der Schienen-Methoden in einer Weise, die offensichtlich für den Anrufer.
Ihre neue Methode genannt werden sollte
awesome_stylesheet_link_tag
so, die anderen Schienen devs Lesen kann, den code und die Frage stellen "Was ist so toll über das link-tag?".Als kleine änderung könnte man überschreiben, aber pass in
:awesome => true
als ein argument, damit Sie zumindest eine Ahnung davon, dass etwas im Gange ist.Änderung des Verhaltens eine weit verbreitete Methode wie
stylesheet_link_tag
schafft einen potenziellen künftigen Missverständnis, wo keiner benötigt wird.