Warum kann ich in den Ansichten für einen anderen Controller auf Hilfsmethoden für einen Controller zugreifen? Gibt es eine Möglichkeit, dies zu deaktivieren, ohne Rails zu hacken / zu patchen?
Warum kann ich in den Ansichten für einen anderen Controller auf Hilfsmethoden für einen Controller zugreifen? Gibt es eine Möglichkeit, dies zu deaktivieren, ohne Rails zu hacken / zu patchen?
Antworten:
Die Methode von @George Schreiber funktioniert ab Rails 3.1 nicht mehr. Der Code hat sich erheblich geändert.
Es gibt jedoch jetzt eine noch bessere Möglichkeit, diese Funktion in Rails 3.1 (und hoffentlich später) zu deaktivieren. Fügen Sie in Ihrer config / application.rb folgende Zeile hinzu:
config.action_controller.include_all_helpers = false
Dadurch wird verhindert, dass ApplicationController alle Helfer lädt .
(Für alle Interessierten gibt es hier die Pull-Anfrage, bei der die Funktion erstellt wurde .)
Die Antwort hängt von der Rails-Version ab.
Ändern Sie die include_all_helpers
Konfiguration false
in eine Umgebung, in der Sie die Konfiguration anwenden möchten. Wenn die Konfiguration auf alle Umgebungen angewendet werden soll, ändern Sie sie in application.rb
.
config.action_controller.include_all_helpers = false
Wenn false, wird die Aufnahme übersprungen .
Löschen Sie die folgende Zeile aus ApplicationController
helper :all
Auf diese Weise lädt jeder Controller seine eigenen Helfer.
include HelperName
oben in Ihrem ApplicationHelper hinzufügen .
In Schienen 3 actioncontroller/base.rb
(um Linie 224):
def self.inherited(klass)
super
klass.helper :all if klass.superclass == ActionController::Base
end
Also ja, wenn Sie Ihre Klasse ableiten ActionController::Base
, werden alle Helfer einbezogen.
Um dies zu umgehen, rufen Sie am Anfang des Codes Ihres Controllers auf clear_helpers
( AbstractClass::Helpers
; enthalten in ActionController::Base
). Quellcode-Kommentar für clear_helpers:
# Clears up all existing helpers in this class, only keeping the helper
# with the same name as this class.
Z.B:
class ApplicationController < ActionController::Base
clear_helpers
...
end
clear_helpers
den (Leistungs-) Schaden aufrufen, ist er bereits angerichtet, da alle Helfer geladen wurden. Sie möchten es wirklich verwenden config.action_controller.include_all_helpers = false
(wie oben in @Craig Walker angegeben), da es verhindert, dass die Helfer überhaupt geladen werden, wodurch Sie eine gewisse Leistung erzielen (möglicherweise am bedeutendsten im Entwicklungsmodus). Vielen Dank, dass Sie das actioncontroller/base.rb
Snippet hinzugefügt haben. Es ist immer schön, Code zu sehen und einige der Rätsel zu lösen.
clear_helpers
ist immer noch nützlich für Schienen 3.0 - config.action_controller.include_all_helpers = false
ist nur Schienen 3.1 und höher.
In Rails 2 bestand die Standardfunktionalität von ActionController :: Base darin, alle Helfer einzuschließen.
Änderungssatz 6222 am 24.02.07 20:33:47 (vor 3 Jahren) von dhh : Machen Sie eine Standardannahme, dass Sie immer alle Helfer wollen (yeah, yeah)
Veränderung:
class ApplicationController < ActionController::Base
helper :all # include all helpers, all the time
end
Ab Rails 3 Beta 1 ist dies nicht mehr der Fall, wie im CHANGELOG angegeben: