2010-09-27 8 views
6

Supposons que j'ai un modèle Ruby ERB nommé my_template.html.erb, et il contient les éléments suivants:Existe-t-il un moyen de lister les variables disponibles dans un modèle Ruby ERB?

<div><%= @div_1 %></div> 
<div><%= @div_2 %></div> 
<div><%= @div_3 %></div> 

Est-il possible que je peux énumérer toutes les programatically variables disponibles dans le modèle?

Par exemple, la méthode suivante:

def list_out_variables 
    template = File.open("path_to/my_template.html.erb", "rb").read 
    erb = ERB.new(template) 
    erb.this_method_would_list_out_variables 
end 

retourne quelque chose comme:

['div1','div2','div3'] 

Toute aide serait grandement appréciée.

Merci, Mike

+1

Je ne sais pas s'il est effectivement possible, mais il semble être une mauvaise idée pour moi. Normalement, la vue dépend du contrôleur, pas de l'inverse. –

Répondre

21

Pour obtenir une liste des variables disponibles dans votre fichier .erb (du contrôleur):

Ajouter un point d'arrêt dans le erb:

<% debugger %> 

Puis tapez instance_variables dans le débogueur pour voir toutes les variables d'instance disponibles.

Ajouté: Notez que instance_variables est une méthode disponible à partir de l'objet de classe Ruby et de toutes ses sous-classes. (Comme noté par @mikezter.) Ainsi, vous pouvez appeler la méthode par programmation à partir de votre sw plutôt que d'utiliser le débogueur si vous le souhaitez vraiment.

Vous obtiendrez une liste de variables d'instance pour l'objet actuel.

Ajouté: Pour obtenir une liste des variables utilisées par un fichier .erb:

# <template> is loaded with the entire contents of the .erb file as 
# one long string 
var_array = template.scan(/(\@[a-z]+[0-9a-z]*)/i).uniq 
+1

-1 pour dire 'instance_variables' est une commande de débogueur. C'est une méthode sur 'Object' – mikezter

+4

@mikezter: -1? Cela semble un peu dur. Les docs du débogueur (voir le lien dans la réponse) ne sont pas si clairs. J'aurais upvoted votre commentaire si vous aviez simplement souligné que saisir des variables d'instance dans le débogueur envoyait vraiment ce nom de méthode à l'objet courant. –

+0

Merci pour l'aide! Pour tout le monde: le groupe de capture dans la regex (la parenthèse) est inutile, et provoque un tableau imbriqué au lieu d'un tableau de noms de variables. –