2010-09-27 20 views
6

Supongamos que tengo una plantilla Rubí ERB llamado my_template.html.erb, y contiene lo siguiente:¿Hay una manera de enumerar las variables disponibles en una plantilla de Rubí ERB?

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

¿Hay una manera que puedo enumerar mediante programación a cabo todas las variables disponibles en la plantilla?

Por ejemplo, el siguiente método:

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 

volvería algo como:

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

Cualquier ayuda sería muy apreciada.

Gracias, Mike

+1

No sabe si es realmente posible, pero parece una mala idea. Normalmente, la vista depende del controlador, no de otra manera. –

Respuesta

21

Para obtener una lista de las variables disponibles para su archivo .erb (desde el controlador):

Añadir un punto de interrupción en el erb:

<% debugger %> 

Luego, escriba instance_variables en el depurador para ver todas las variables de instancia disponibles.

Agregado: Tenga en cuenta que instance_variables es un método disponible del objeto de la clase Ruby y de todas sus subclases. (Como se ha señalado por @mikezter.) Por lo que podría llamar al método mediante programación desde dentro de su sw en lugar de utilizar el depurador si realmente quería.

Vas a obtener una lista de las variables de instancia para el objeto actual.

Agregado: Para obtener una lista de las variables utilizadas por un archivo .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 por decir 'instance_variables' es un comando depurador. Es un método en 'Objeto' – mikezter

+4

@mikezter: -1? Parece un poco duro. Los documentos del depurador (ver el enlace en la respuesta) no son tan claros. Habría subido la fecha a su comentario si hubiera señalado que al escribir las variables de instancia en el depurador realmente está enviando ese nombre de método al objeto actual. –

+0

¡Gracias por la ayuda! Para cualquier otra persona: el grupo de captura dentro de la expresión regular (el paréntesis) es innecesario, y causa una matriz anidada en lugar de simplemente una matriz de los nombres de las variables. –

Cuestiones relacionadas