Pourquoi tous les assistants Rails sont-ils disponibles pour toutes les vues, tout le temps? Existe-t-il un moyen de désactiver cela?

89

Pourquoi puis-je accéder aux méthodes d'assistance pour un contrôleur dans les vues d'un contrôleur différent? Existe-t-il un moyen de désactiver cela sans pirater / patcher les Rails?

Nate Smith
la source
3
Il y a une nouvelle réponse plus pertinente. Découvrez la réponse de Craig Walkers
EE33

Réponses:

106

La méthode de @George Schreiber ne fonctionne pas depuis Rails 3.1; le code a considérablement changé.

Cependant, il existe maintenant un moyen encore meilleur de désactiver cette fonctionnalité dans Rails 3.1 (et, espérons-le, plus tard). Dans votre config / application.rb, ajoutez cette ligne:

config.action_controller.include_all_helpers = false

Cela empêchera ApplicationController de charger tous les helpers .

(Pour toute personne intéressée, voici la pull request où la fonctionnalité a été créée .)

Craig Walker
la source
Je suis sur 3.2. Application.config signifie-t-il ici config / application.rb?
Brandon Henry
ApplicationHelper sera-t-il également inclus si je désactive include_all_helpers ou si je dois l'inclure manuellement?
Robert Audi
@AzizLight Je ne suis pas sûr, puisque je n'ai pas testé, ça. Cependant, je m'y attendais, car ApplicationHelper est censé être toujours disponible dans les vues en tant qu'assistant "racine". Ce sont les assistants de contrôleurs indépendants qui sont le principal problème ici.
Craig Walker
3
Je pense que cela devrait être le comportement par défaut.
Nafaa Boutefer
98

La réponse dépend de la version de Rails.

Rails> = 3,1

Modifiez la include_all_helpersconfiguration en falsedans n'importe quel environnement où vous souhaitez appliquer la configuration. Si vous souhaitez que la configuration s'applique à tous les environnements, modifiez-la application.rb.

config.action_controller.include_all_helpers = false

Lorsqu'il est faux, il ignorera l'inclusion .

Rails <3.1

Supprimer la ligne suivante de ApplicationController

helper :all

De cette façon, chaque contrôleur chargera ses propres assistants.

Simone Carletti
la source
2
Cette ligne n'existe pas pour moi dans Rails 3.2, donc cette solution ne s'applique probablement plus aux versions ultérieures de Rails.
Tyler Collier du
Ce que @TylerCollier a dit!
EE33
Je serais intéressé de savoir pourquoi cela a changé de manière si significative depuis Rails up version 3.1? Cela n'a pas beaucoup de sens pour moi.
Joshua Muheim
6
REMARQUE: Les commentaires ci-dessus ne sont plus valides, maintenant que la réponse a été mise à jour pour inclure Rails> 3.1
Kyle Heironimus
3
Remarque: votre ApplicationHelper sera toujours chargé. Si vous souhaitez inclure des helpers spécifiques tout le temps, vous pouvez ajouter include HelperNameen haut de votre ApplicationHelper.
vansan le
27

Dans Rails 3, actioncontroller/base.rb(autour de la ligne 224):

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

Donc oui, si vous dérivez votre classe ActionController::Base, tous les assistants seront inclus.

Pour contourner ce problème, appelez clear_helpers( AbstractClass::Helpers; inclus dans ActionController::Base) au début du code de votre contrôleur. Commentaire sur le code source pour clear_helpers:

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

Par exemple:

class ApplicationController < ActionController::Base
  clear_helpers
  ...
end
George Schreiber
la source
10
Au moment où vous appelez, clear_helpersles dommages (de performance) ont déjà été causés puisque tous les helpers ont été chargés. Vous voulez vraiment utiliser config.action_controller.include_all_helpers = false(comme l'indique @Craig Walker, ci-dessus), car cela empêche les helpers d'être chargés en premier lieu, vous permettant ainsi de gagner en performances (peut-être plus significativement en mode développement). Merci d'avoir inclus l' actioncontroller/base.rbextrait; c'est toujours agréable de voir le code et de supprimer une partie du mystère.
George Anderson
clear_helpersest toujours utile pour les rails 3.0 - config.action_controller.include_all_helpers = falseest seulement les rails 3.1 et plus.
robd
5

En fait, dans Rails 2 , la fonctionnalité par défaut d'ActionController :: Base était d'inclure tous les helpers.

Changeset 6222 le 24/02/07 20:33:47 (il y a 3 ans) par dhh : Faites-en l'hypothèse par défaut que vous voulez tous les assistants, tout le temps (ouais, ouais)

changement:

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

À partir de Rails 3 beta 1, ce n'est plus le cas comme indiqué dans le CHANGELOG:

  • Ajout qu'ActionController :: Base fait maintenant helper: tout au lieu de s'appuyer sur le ApplicationController par défaut dans Rails pour le faire [DHH]
octet de données
la source
1
cela signifie-t-il que dans Rails 3, tous les helpers sont par défaut tout le temps chargés?
Nik So
@Nik sûrement oui, au moins pour 3.2
Nithin