Accéder à une variable d’instance externe
Mercredi, le 19 novembre 2008 par Jonathan GrenierRuby on Rails se sert beaucoup des variables d’instances de Ruby (@variable) pour permettre aux Vues (View) et aux helpers d’accéder aux variables crées par les controlleurs. Ça fonctionne super bien jusqu’au moment où vous essayez de créer un helper FormBuilder. Pour ce faire, vous devez créer une nouvelle classe dérivant de ActionView::Helpers::FormBuilder. Comme votre helper est donc dans une autre classe, celui-ci n’à pas accès aux variables que vos controlleurs auraient pu créer. Dans mon cas, je tentais de créer un helper « label » bilingue. Celui-ci devait donc connaître la langue du visiteur et celle-ci est gardée en mémoire dans une variable d’instance @language.
Comme c’est souvent le cas, Ruby à une belle façon de nous aider. Premièrement, allons voir la liste des méthodes que notre objet expose:
MyObject.public_methods
Avec la commande ci-dessus, on trouve que quelques méthodes intéressantes sont accessibles :
- instance_variable_defined?
- instance_variable_get
- instance_variable_names
- instance_variable_set
- instance_variables
Nous pouvons donc dire MyObject.instance_variable_get(« @language ») pour avoir la valeur de la variable. Dans le cas d’un helper FormBuilder, ça fonctionne, mais encore faut-il savoir sur quel objet appeler la méthode. La réponse, dans ce cas, est l’objet @template qui est fourni par ActionView::Helpers::FormBuilder et qui représente l’objet « vue ». On peux donc faire:
template.instance_variable_get('@language')
On reparlera des FormBuilder très bientôt.