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?


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


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.


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

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]

1
Bedeutet das, dass in Rails 3 standardmäßig alle Helfer geladen sind?
Nik So

@ Nik sicherlich ja, zumindest für 3.2
Nithin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.