[Rails vu de l'intérieur] Les variables d'instance et les contrôleurs



Ecrit par Anthony Heukmes le 03 mars 2009 22:44

2 commentaires



Lors d'un de mes derniers projets, j'ai du mettre en place un contrôleur "générique" permettant de traiter des objets ActiveRecord différents.
Ainsi, un administrateur devait par exemple pouvoir valider des commentaires et des suggestions de liens en utilisant la même interface (/activations).

Ruby étant un langage dynamique de nature, cette solution a bien entendu été très simple à implémenter.

Les astuces suivantes m'ont cependant été utiles :

Le code suivant permet de récupérer dynamiquement une classe dont le nom n'est connu qu'à l'exécution :

klass_name = "Article"

klass = Kernel.const_get(klass_name)
klass.find(:all, :order => 'created_at DESC')



Il peut également être très intéressant de définir/récupérer des variables d'instance dynamiquement :

var_name = "article"

instance_variable_set("@#{var_name}", klass.find(params[:id]))
instance_variable_get("@#{var_name}")



A ce propos, savez-vous comment est-il possible que les variables d'instance que vous définissez dans vos contrôleurs soient automatiquement disponibles dans vos vues?
Dans la plupart des frameworks vous devez explicitement spécifier les variables que vous souhaitez mettre à disposition des vues.
Ainsi avec Java et Spring par exemple, vous devez créer une Map contenant vos variables et les passer en paramètre à la méthode render.
Avec Ruby on Rails c'est automatique et c'est tant mieux! Mais comment cela fonctionne-t-il?

Très simplement!

La classe ActionView::Base (actionpack/lib/action_view/base.rb) possède la méthode suivante :

def copy_ivars_from_controller

if @controller
variables = @controller.instance_variable_names
variables -= @controller.protected_instance_variables if @controller.respond_to?(:protected_instance_variables)
variables.each { |name| instance_variable_set(name, @controller.instance_variable_get(name)) }
end
end



... et celle-ci sera invoquée par la méthode render de votre vue.
Cette méthode permet de récupérer toutes les variables d'instance du contrôleur courant (sans les variables protégées) et de les créer dans votre vue en utilisant instance_variable_set.


Bookmark and Share

Ajouter un commentaire



2 commentaires pour cet article



That?s not just logic. That?s raelly sensible.


Ecrit par That?s not just logic. That?s raelly sensible. le 10 mai 2011 21:44

VJ4gbg , [url=http://netuqesptksz.com/]netuqesptksz[/url], [link=http://gqbifzzkhzpb.com/]gqbifzzkhzpb[/link], http://hfxxulodhtql.com/


Ecrit par VJ4gbg , [url=http://netuqesptksz.com/]netuqesptksz[/url], [link=http://gqbifzzkhzpb.com/]gqbifzzkhzpb[/link], http://hfxxulodhtql.com/ le 29 mai 2011 08:41