Perché tutti gli helper di Rails sono sempre disponibili per tutte le visualizzazioni? C'è un modo per disabilitarlo?


89

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?


3
C'è una nuova risposta più pertinente.
Dai un'occhiata alla

Risposte:


106

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


Sono su 3.2. Application.config qui significa config / application.rb?
Brandon Henry

Anche ApplicationHelper verrà incluso se disabilito include_all_helpers o se devo includerlo manualmente?
Robert Audi

@ AzizLight non sono sicuro, dal momento che non l'ho testato, quello. Tuttavia, me lo aspetto, poiché ApplicationHelper deve essere sempre disponibile nelle viste come helper "root". Sono gli helper di controller non correlati che sono di primaria importanza qui.
Craig Walker

3
Penso che questo dovrebbe essere il comportamento predefinito.
Nafaa Boutefer

98

La risposta dipende dalla versione di Rails.

Rotaie> = 3.1

Modificare la include_all_helpersconfigurazione in falsein 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 .

Rotaie <3.1

Elimina la riga seguente da ApplicationController

helper :all

In questo modo ogni controller caricherà i propri helper.


2
Questa riga non esiste per me in Rails 3.2, quindi questa soluzione probabilmente non si applica più alle versioni successive di Rails.
Tyler Collier

Cosa ha detto @TylerCollier!
EE33

Sarei interessato al motivo per cui questo è cambiato in modo così significativo dalla versione 3.1 di Rails? Non ha molto senso per me.
Joshua Muheim

6
NOTA: I commenti sopra non sono più validi, ora che la risposta è stata aggiornata per includere Rails> 3.1
Kyle Heironimus

3
Nota: il tuo ApplicationHelper verrà comunque caricato. Se desideri includere sempre degli helper specifici, puoi aggiungerli include HelperNameall'inizio del tuo ApplicationHelper.
vansan

27

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

10
Nel momento in cui chiami clear_helpersil 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.rbsnippet; è sempre bello vedere il codice e rimuovere parte del mistero.
George Anderson

clear_helpersè ancora utile per rails 3.0 - config.action_controller.include_all_helpers = falseè solo per rails 3.1 e versioni successive.
rapinato il

5

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:

  • Aggiunto che ActionController :: Base ora fa l'helper: tutto invece di fare affidamento sull'ApplicationController predefinito in Rails per farlo [DHH]

1
quindi questo significa che in Rails 3 tutti gli helper sono sempre caricati di default?
Nik So

@Nik sicuramente sì, almeno per 3.2
Nithin
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.