Pourquoi puis-je accéder aux méthodes d'assistance pour un contrôleur dans les vues d'un autre contrôleur? Existe-t-il un moyen de désactiver cela sans pirater/patcher Rails?
La méthode de @George Schreiber ne fonctionne pas à partir de Rails 3.1; le code a considérablement changé.
Cependant, il existe désormais un meilleur moyen 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 assistants .
(Pour toute personne intéressée, voici la demande de pull où la fonctionnalité a été créée .)
La réponse dépend de la version Rails.
Changer la include_all_helpers
config à false
dans tout environnement où vous souhaitez appliquer la configuration. Si vous souhaitez que la configuration s'applique à tous les environnements, modifiez-la dans application.rb
.
config.action_controller.include_all_helpers = false
Si faux, il sauter l'inclusion .
Supprimez la ligne suivante de ApplicationController
helper :all
De cette façon, chaque contrôleur chargera ses propres assistants.
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
Alors oui, si vous dérivez votre classe de 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 du 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
En fait, dans Rails 2 , la fonctionnalité par défaut d'ActionController :: Base était d'inclure tous les assistants.
Changeset 6222 le 24/02/07 20:33:47 (il y a 3 ans) par dhh : Faites-vous une supposition 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
Depuis Rails 3 beta 1, ce n'est plus le cas comme indiqué dans le CHANGELOG: