Perché posso accedere ai metodi di supporto per un controller nelle viste per un controller diverso? C'è un modo per disabilitarlo senza hackerare / applicare patch a Rails?
Perché posso accedere ai metodi di supporto per un controller nelle viste per un controller diverso? C'è un modo per disabilitarlo senza hackerare / applicare patch a Rails?
Risposte:
Il metodo di @George Schreiber non funziona a partire da Rails 3.1; il codice è cambiato in modo significativo.
Tuttavia, ora c'è un modo ancora migliore per disabilitare questa funzione in Rails 3.1 (e si spera in seguito). Nel tuo config / application.rb, aggiungi questa riga:
config.action_controller.include_all_helpers = false
Ciò impedirà ad ApplicationController di caricare tutti gli helper .
(Per chiunque sia interessato, ecco la richiesta pull in cui è stata creata la funzione .)
La risposta dipende dalla versione di Rails.
Modificare la include_all_helpers
configurazione in false
in qualsiasi ambiente in cui si desidera applicare la configurazione. Se vuoi che la configurazione si applichi a tutti gli ambienti, modificala in application.rb
.
config.action_controller.include_all_helpers = false
Se falso, salterà l'inclusione .
Elimina la riga seguente da ApplicationController
helper :all
In questo modo ogni controller caricherà i propri helper.
include HelperName
all'inizio del tuo ApplicationHelper.
In Rails 3, actioncontroller/base.rb
(intorno alla riga 224):
def self.inherited(klass)
super
klass.helper :all if klass.superclass == ActionController::Base
end
Quindi sì, se derivi la tua classe ActionController::Base
, tutti gli helper saranno inclusi.
Per aggirare questo problema, chiama clear_helpers
( AbstractClass::Helpers
; included in ActionController::Base
) all'inizio del codice del controller. Commento sul codice sorgente per clear_helpers:
# Clears up all existing helpers in this class, only keeping the helper
# with the same name as this class.
Per esempio:
class ApplicationController < ActionController::Base
clear_helpers
...
end
clear_helpers
il danno (delle prestazioni) è già stato fatto poiché tutti gli helper sono stati caricati. Lo vuoi davvero usare config.action_controller.include_all_helpers = false
(come afferma @Craig Walker, sopra), poiché impedisce il caricamento degli helper in primo luogo, ottenendo così delle prestazioni (forse in modo più significativo in modalità di sviluppo). Grazie per aver incluso lo actioncontroller/base.rb
snippet; è sempre bello vedere il codice e rimuovere parte del mistero.
clear_helpers
è ancora utile per rails 3.0 - config.action_controller.include_all_helpers = false
è solo per rails 3.1 e versioni successive.
In realtà in Rails 2 , la funzionalità predefinita di ActionController :: Base era di includere tutti gli helper.
Changeset 6222 il 24/02/07 20:33:47 (3 anni fa) da dhh : Assumi di default che vuoi tutti gli helper, sempre (yeah, yeah)
modificare:
class ApplicationController < ActionController::Base
helper :all # include all helpers, all the time
end
A partire da Rails 3 beta 1, non è più così, come indicato nel CHANGELOG: