89 votes

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

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 ?

105voto

Craig Walker Points 13478

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

98voto

Simone Carletti Points 77653

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.

27voto

George Schreiber Points 287

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

5voto

databyte Points 708

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X