Dlaczego wszyscy pomocnicy Rails są dostępni dla wszystkich widoków przez cały czas? Czy jest sposób, aby to wyłączyć?

89

Dlaczego mogę uzyskać dostęp do metod pomocniczych dla jednego kontrolera w widokach dla innego kontrolera? Czy jest sposób, aby to wyłączyć bez hakowania / łatania Railsów?

Nate Smith
źródło
3
Jest nowa, bardziej odpowiednia odpowiedź. Sprawdź odpowiedź Craiga
Walkersa

Odpowiedzi:

106

Metoda @George Schreibera nie działa od wersji Rails 3.1; kod uległ znacznej zmianie.

Jednak jest teraz jeszcze lepszy sposób na wyłączenie tej funkcji w Railsach 3.1 (i miejmy nadzieję, że później). W swoim config / application.rb dodaj tę linię:

config.action_controller.include_all_helpers = false

Uniemożliwi to ApplicationController załadowanie wszystkich pomocników .

(Dla każdego, kto jest zainteresowany, oto żądanie ściągnięcia, w którym utworzono funkcję ).

Craig Walker
źródło
Jestem na 3.2. Czy application.config oznacza tutaj config / application.rb?
Brandon Henry
Czy ApplicationHelper również zostanie uwzględniony, jeśli wyłączę include_all_helpers lub muszę dołączyć go ręcznie?
Robert Audi
@AzizLight Nie jestem pewien, ponieważ nie testowałem tego. Jednak spodziewałbym się tego, ponieważ ApplicationHelper ma być zawsze dostępny w widokach jako pomocnik „root”. To pomocnicy niepowiązanych kontrolerów są tutaj głównym problemem.
Craig Walker
3
Myślę, że powinno to być zachowanie domyślne.
Nafaa Boutefer
98

Odpowiedź zależy od wersji Railsów.

Szyny> = 3.1

Zmień include_all_helperskonfigurację na falsew dowolnym środowisku, w którym chcesz zastosować konfigurację. Jeśli chcesz, aby konfiguracja była stosowana we wszystkich środowiskach, zmień ją w application.rb.

config.action_controller.include_all_helpers = false

Gdy fałsz, pominie dołączanie .

Szyny <3.1

Usuń następujący wiersz z ApplicationController

helper :all

W ten sposób każdy kontroler załaduje swoich własnych pomocników.

Simone Carletti
źródło
2
Ta linia nie istnieje dla mnie w Railsach 3.2, więc to rozwiązanie prawdopodobnie nie ma już zastosowania w późniejszych wersjach Railsów.
Tyler Collier,
Co powiedział @TylerCollier!
EE33
Byłbym zainteresowany tym, dlaczego zmieniło się to tak znacząco od wersji 3.1 Railsów? Nie ma to dla mnie sensu.
Joshua Muheim
6
UWAGA: Powyższe komentarze są już nieaktualne, teraz, gdy odpowiedź została zaktualizowana i zawiera Rails> 3.1
Kyle Heironimus
3
Uwaga: aplikacja ApplicationHelper będzie nadal ładowana. Jeśli chcesz cały czas dołączać określonych pomocników, możesz dodać include HelperNameje u góry swojego ApplicationHelper.
vansan
27

W Rails 3 actioncontroller/base.rb(wokół linii 224):

def self.inherited(klass)
  super
  klass.helper :all if klass.superclass == ActionController::Base
end

Więc tak, jeśli wywodzisz się ze swojej klasy ActionController::Base, wszyscy pomocnicy będą uwzględnieni.

Aby obejść ten problem, wywołaj clear_helpers( AbstractClass::Helpers; zawarte w ActionController::Base) na początku kodu kontrolera. Komentarz do kodu źródłowego dla clear_helpers:

# Clears up all existing helpers in this class, only keeping the helper
# with the same name as this class.

Na przykład:

class ApplicationController < ActionController::Base
  clear_helpers
  ...
end
George Schreiber
źródło
10
Do czasu wywołania clear_helpersobrażeń (wydajności) zostało już dokonane, ponieważ wszyscy pomocnicy zostali załadowani. Naprawdę chcesz użyć config.action_controller.include_all_helpers = false(jak stwierdza @Craig Walker, powyżej), ponieważ przede wszystkim zapobiega ładowaniu pomocników, dzięki czemu zyskujesz pewną wydajność (być może najbardziej znaczący w trybie programistycznym). Dziękujemy za actioncontroller/base.rbdołączenie fragmentu; zawsze miło jest zobaczyć kod i usunąć część tajemnic.
George Anderson,
clear_helpersjest nadal użyteczny dla rails 3.0 - config.action_controller.include_all_helpers = falsedotyczy tylko rails 3.1 i nowszych.
robd
5

Właściwie w Railsach 2 domyślną funkcjonalnością ActionController :: Base było uwzględnienie wszystkich helperów.

Zestaw zmian 6222 z dnia 24.02.07 20:33:47 (3 lata temu) przez dhh : Ustaw domyślne założenie, że potrzebujesz wszystkich pomocników przez cały czas (tak, tak)

zmiana:

class ApplicationController < ActionController::Base 
  helper :all # include all helpers, all the time 
end 

Od wersji Rails 3 beta 1, nie ma to już miejsca, jak zauważono w dzienniku zmian:

  • Dodano, że ActionController :: Base teraz robi helper: all zamiast polegać na domyślnym ApplicationController w Railsach, aby to zrobić [DHH]
bajt danych
źródło
1
czy to oznacza, że ​​w Railsach 3 wszyscy pomocnicy są domyślnie ładowani przez cały czas?
Nik So,
@Nik na pewno tak, przynajmniej na 3.2
Nithin,