Pourquoi puis-je accéder aux méthodes d'aide d'un contrôleur dans les vues d'un autre contrôleur ? Existe-t-il un moyen de désactiver cela sans pirater/Parcheando Rails ?
Réponses
Trop de publicités?La méthode de @George Schreiber ne fonctionne plus depuis Rails 3.1 ; le code a été considérablement modifié.
Cependant, il existe désormais un moyen encore plus efficace de désactiver cette fonctionnalité dans Rails 3.1 (et, espérons-le, dans les versions ultérieures). Dans votre config/application.rb, ajoutez cette ligne :
config.action_controller.include_all_helpers = false
Cela permettra empêcher ApplicationController de charger tous les helpers .
(Pour tous ceux qui sont intéressés, voici la demande de retrait où la fonctionnalité a été créée .)
La réponse dépend de la version de Rails.
Rails >= 3.1
Changez le include_all_helpers
config à false
dans tout environnement où vous voulez appliquer la configuration. Si vous souhaitez que la configuration s'applique à tous les environnements, modifiez-la dans le champ application.rb
.
config.action_controller.include_all_helpers = false
Lorsqu'il est faux, il sauter l'inclusion .
Rails < 3.1
Supprimer la ligne suivante de ApplicationController
helper :all
De cette façon, chaque contrôleur chargera ses propres aides.
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 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 toutes les aides.
Changeset 6222 le 24/02/07 20:33:47 (il y a 3 ans) par dhh : Faire en sorte que l'on suppose par défaut que l'on veut toutes les aides, 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 :
- Ajouté que ActionController::Base fait maintenant helper :all au lieu de compter sur ApplicationController par défaut dans Rails pour le faire [DHH].