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?
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?
Odpowiedzi:
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ę ).
Odpowiedź zależy od wersji Railsów.
Zmień include_all_helpers
konfigurację na false
w 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 .
Usuń następujący wiersz z ApplicationController
helper :all
W ten sposób każdy kontroler załaduje swoich własnych pomocników.
include HelperName
je u góry swojego ApplicationHelper.
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
clear_helpers
obraż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.rb
dołączenie fragmentu; zawsze miło jest zobaczyć kod i usunąć część tajemnic.
clear_helpers
jest nadal użyteczny dla rails 3.0 - config.action_controller.include_all_helpers = false
dotyczy tylko rails 3.1 i nowszych.
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: