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?
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?
Réponses:
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 .)
La réponse dépend de la version de Rails.
Modifiez la include_all_helpers
configuration en false
dans 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 .
Supprimer la ligne suivante de ApplicationController
helper :all
De cette façon, chaque contrôleur chargera ses propres assistants.
include HelperName
en haut de votre ApplicationHelper.
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
clear_helpers
les 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.rb
extrait; c'est toujours agréable de voir le code et de supprimer une partie du mystère.
clear_helpers
est toujours utile pour les rails 3.0 - config.action_controller.include_all_helpers = false
est seulement les rails 3.1 et plus.
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: