2010-09-27 12 views
6

Supponiamo che io sono un modello di Ruby ERB chiamato my_template.html.erb, e contiene i seguenti:C'è un modo per elencare le variabili disponibili in un modello ERB di Ruby?

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

C'è un modo per programatically elencare tutte le variabili disponibili nel modello?

Ad esempio, il seguente metodo:

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 

restituirebbe qualcosa come:

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

Qualsiasi aiuto sarebbe molto apprezzato.

Grazie, Mike

+1

Non so se è effettivamente possibile, ma sembra una cattiva idea per me. Normalmente, la vista dipende dal controller, non da un'altra parte. –

risposta

21

Per ottenere un elenco di variabili disponibili al file .erb (dal controller):

Aggiungere un punto di interruzione nel Erb:

<% debugger %> 

Quindi digitare instance_variables nel debugger per visualizzare tutte le variabili di istanza disponibili.

Aggiunto: Si noti che instance_variables è un metodo disponibile dall'oggetto Classe Ruby e da tutte le sue sottoclassi. (Come notato da @mikezter.) Quindi potresti chiamare il metodo a livello di programmazione dal tuo sw piuttosto che usare il debugger se lo volessi davvero.

Tornerà un elenco di variabili di istanza per l'oggetto corrente.

Aggiunto: Per ottenere un elenco delle variabili utilizzate da un file .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 per aver detto 'instance_variables' è un comando di debugger. È un metodo su 'Object' – mikezter

+4

@mikezter: -1? Sembra un po 'duro. I documenti del debugger (vedi link in risposta) non sono così chiari. Avrei svalutato il tuo commento se avessi semplicemente sottolineato che digitando instance_variables nel debugger stai davvero inviando il nome di quel metodo all'oggetto corrente. –

+0

Grazie per l'aiuto! Per chiunque altro: il gruppo di cattura all'interno della regex (la parentesi) non è necessario e causa una matrice nidificata invece di una semplice matrice di nomi di variabili. –

Problemi correlati