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