Ruby on Rails - Pourquoi inclure tous les helpers dans toutes les vues?



Ecrit par Anthony Heukmes le 25 mars 2009 21:55

5 commentaires



Dans l'application_helper.rb de mon projet actuel, j'ai différentes méthodes qui fournissent des comportements par défaut.
Ces méthodes sont donc communes à tous mes contrôleurs mais ceux-ci peuvent modifier le comportement de ces méthodes si nécessaire.
Pour cela, ils peuvent les redéfinir dans leur propre module helper.

Imaginons par exemple la méthode say_hi dans l'application_helper.rb :

def say_hi

"Hi from ApplicationController"
end"


Si j'appelle cette méthode dans les vues de mes contrôleurs Controller1 et Controller2, le texte "Hi from ApplicationController" sera correctement affiché.
Dans Controller1, je souhaite modifier ce message de bienvenue car le comportement par défaut ne me convient pas. Je peux donc redéfinir la méthode say_hi dans controller1_helper.rb :

def say_hi

"Hi from Controller1"
end"


Et tout fonctionne très bien.
J'effectue maintenant la même opération dans controller2_helper.rb :

def say_hi

"Hi from Controller2"
end"


Le message de bienvenue affiché dans les pages du Controller2 sera correct. Par contre, les pages du Controller1 n'afficheront plus "Hi from Controller1" mais "Hi from Controller2".
C'est un comportement plutôt innatendu, je ne m'attendais en effet pas à un tel résultat.

Ce problème est causé par la ligne suivante ajoutée automatiquement dans votre application_controller lors de la génération de votre projet Rails :

helper :all


L'intérêt de cette méthode est de rendre tous les helpers que vous avez définis disponibles dans toutes les vues de vos différents contrôleurs.
Pour que cela soit possible, cet appel va inclure toutes les méthodes de tous les helpers dans la vue courante.
Controller2 apparaît en dernier dans la liste des helpers inclus (ordre alphabétique) et c'est donc la méthode say_hi de ce dernier qui sera prise en compte.

Vous pouvez constater ce fonctionnement en ouvrant le fichier actionpack/lib/action_controller/helpers.rb :

def helper(*args, &block)

args.flatten.each do |arg|
case arg
when Module
add_template_helper(arg)
when :all
helper(all_application_helpers)
when String, Symbol
file_name = arg.to_s.underscore + '_helper'
class_name = file_name.camelize

begin
require_dependency(file_name)
rescue LoadError => load_error
requiree = / -- (.*?)(.rb)?$/.match(load_error.message).to_a[1]
if requiree == file_name
msg = "Missing helper file helpers/#{file_name}.rb"
raise LoadError.new(msg).copy_blame!(load_error)
else
raise
end
end
add_template_helper(class_name.constantize)
else
raise ArgumentError, "helper expects String, Symbol, or Module argument (was: #{args.inspect})"
end
end


def all_application_helpers

extract = /^#{Regexp.quote(helpers_dir)}\/?(.*)_helper.rb$/
Dir["#{helpers_dir}/**/*_helper.rb"].map { |file| file.sub extract, '\1' }
end


Lorsque la méthode helper est appelée avec le paramètre :all, celle-ci va se réinvoquer avec comme paramètre, le résultat de l'appel à all_application_helpers.
Cette méthode va retourner un tableau contenant les noms des helpers présents dans le dossier app/helpers (dans mon cas, 'application', 'controller1' et 'controller2').
Le nouvel appel à la méthode helper va alors parcourir chaque élément du tableau et inclure le helper correspondant.

J'ai donc pu facilement régler mon problème en supprimant cette ligne (helper :all) de mon application_controller.rb

Mais plus généralement, je me pose des questions quant à l'intérêt de cette méthode.
Pourquoi les méthodes du helper associé au controller2 devraient être accessibles dans mon controller1?
Je n'ai aucun problème contre l'existence de cette méthode mais c'est pour moi une erreur de l'inclure par défaut dans l'application_controller d'une nouvelle application Rails.
Bookmark and Share

Ajouter un commentaire



5 commentaires pour cet article



I'm out of league here. Too much brain power on dislapy!


Ecrit par I'm out of league here. Too much brain power on dislapy! le 10 mai 2011 23:51

f4nDiy <a href="http://kdrtbblqtgow.com/">kdrtbblqtgow</a>


Ecrit par f4nDiy <a href="http://kdrtbblqtgow.com/">kdrtbblqtgow</a> le 11 mai 2011 03:26

A1UMmS , [url=http://hkbzonnsmobu.com/]hkbzonnsmobu[/url], [link=http://zswfskzzmwer.com/]zswfskzzmwer[/link], http://rcdnxapotraa.com/


Ecrit par A1UMmS , [url=http://hkbzonnsmobu.com/]hkbzonnsmobu[/url], [link=http://zswfskzzmwer.com/]zswfskzzmwer[/link], http://rcdnxapotraa.com/ le 12 mai 2011 13:05

qMaWvW <a href="http://xxmsllphruhg.com/">xxmsllphruhg</a>


Ecrit par qMaWvW <a href="http://xxmsllphruhg.com/">xxmsllphruhg</a> le 14 mai 2011 03:53

hha0Fq , [url=http://jfkzgnznwpfh.com/]jfkzgnznwpfh[/url], [link=http://jwtqysarmswb.com/]jwtqysarmswb[/link], http://ibtjdhcmugir.com/


Ecrit par hha0Fq , [url=http://jfkzgnznwpfh.com/]jfkzgnznwpfh[/url], [link=http://jwtqysarmswb.com/]jwtqysarmswb[/link], http://ibtjdhcmugir.com/ le 29 mai 2011 09:10