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?
ruby-on-rails
ruby
helpers
Nate Smith
źródło
źródło
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ę ).
źródło
Odpowiedź zależy od wersji Railsów.
Szyny> = 3.1
Zmień
include_all_helpers
konfigurację nafalse
w dowolnym środowisku, w którym chcesz zastosować konfigurację. Jeśli chcesz, aby konfiguracja była stosowana we wszystkich środowiskach, zmień ją wapplication.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.
źródło
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 wActionController::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
źródło
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 zaactioncontroller/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:
źródło