web-dev-qa-db-fra.com

Pourquoi tous les Rails helpers sont-ils 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'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?

89
Nate Smith

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

105
Craig Walker

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

Rails> = 3.1

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 .

Rails <3.1

Supprimez la ligne suivante de ApplicationController

helper :all

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

98
Simone Carletti

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
27
George Schreiber

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:

  • Ajout qu'ActionController :: Base fait désormais de l'aide: tout au lieu de compter sur l'ApplicationController par défaut dans Rails pour le faire [DHH]
5
databyte