Warum sind alle Rails-Helfer jederzeit für alle Ansichten verfügbar? Gibt es eine Möglichkeit, dies zu deaktivieren?

89

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?

Nate Smith
quelle
3
Es gibt eine neue, relevantere Antwort. Überprüfen Sie heraus Craig Walkers Antwort
EE33

Antworten:

106

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 .)

Craig Walker
quelle
Ich bin auf 3.2. Bedeutet application.config hier config / application.rb?
Brandon Henry
Wird der ApplicationHelper auch aufgenommen, wenn ich include_all_helpers deaktiviere oder manuell einbinden muss?
Robert Audi
@ AzizLight Ich bin mir nicht sicher, da ich das nicht getestet habe. Ich würde dies jedoch erwarten, da ApplicationHelper immer in Ansichten als "Root" -Helfer verfügbar sein soll. Es sind die Helfer von nicht verwandten Controllern, die hier das Hauptproblem darstellen.
Craig Walker
2
Ich denke, dies sollte das Standardverhalten sein.
Nafaa Boutefer
98

Die Antwort hängt von der Rails-Version ab.

Schienen> = 3.1

Ändern Sie die include_all_helpersKonfiguration falsein 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 .

Schienen <3.1

Löschen Sie die folgende Zeile aus ApplicationController

helper :all

Auf diese Weise lädt jeder Controller seine eigenen Helfer.

Simone Carletti
quelle
2
Diese Zeile existiert für mich in Rails 3.2 nicht, daher gilt diese Lösung wahrscheinlich nicht mehr für spätere Versionen von Rails.
Tyler Collier
Was @ TylerCollier gesagt hat!
EE33
Mich würde interessieren, warum sich dies von Rails bis Version 3.1 so stark geändert hat. Macht für mich nicht viel Sinn.
Joshua Muheim
6
HINWEIS: Die obigen Kommentare sind nicht mehr gültig, da die Antwort aktualisiert wurde, um Rails> 3.1
Kyle Heironimus
3
Hinweis: Ihr ApplicationHelper wird weiterhin geladen. Wenn Sie jederzeit bestimmte Helfer einbeziehen möchten, können Sie diese include HelperNameoben in Ihrem ApplicationHelper hinzufügen .
Vansan
27

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
George Schreiber
quelle
10
Zu dem Zeitpunkt, an dem Sie clear_helpersden (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.rbSnippet hinzugefügt haben. Es ist immer schön, Code zu sehen und einige der Rätsel zu lösen.
George Anderson
clear_helpersist immer noch nützlich für Schienen 3.0 - config.action_controller.include_all_helpers = falseist nur Schienen 3.1 und höher.
Robd
5

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:

  • Es wurde hinzugefügt, dass ActionController :: Base jetzt hilft: alles anstatt sich auf den Standard-ApplicationController in Rails zu verlassen, um dies zu tun [DHH]
Databyte
quelle
1
Bedeutet das, dass in Rails 3 standardmäßig alle Helfer geladen sind?
Nik So
@ Nik sicherlich ja, zumindest für 3.2
Nithin