Suppose I have a Ruby ERB template named my_template.html.erb, and it contains the following:
<div><%= @div_1 %></div>
<div><%= @div_2 %></div>
<div><%= @div_3 %></div>
Is there a way I can programatically list out all the available variables in the template?
For example, the following method:
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
would return something like:
['div1','div2','div3']
Any help would be greatly appreciated.
Thanks, Mike
ERB (or Ruby code generated by ERB) returns a string in the same character encoding as the input string. When the input string has a magic comment, however, it returns a string in the encoding specified by the magic comment.
An ERB template looks like a plain-text document interspersed with tags containing Ruby code. When evaluated, this tagged code can modify text in the template. Puppet passes data to templates via special objects and variables, which you can use in the tagged Ruby code to control the templates' output.
ERB is a templating engine. A templating engine allows you to mix HTML & Ruby so you can generate web pages using data from your database. ERB is Rails default engine for rendering views. Note: Rails uses an implementation called erubi instead of the ERB class from the Ruby standard library.
To get a list of variables available to your .erb file (from the controller):
Add a breakpoint in the erb:
<% debugger %>
Then type instance_variables in the debugger to see all of the available instance variables.
Added: Note that instance_variables is a method available from the Ruby class Object and all of its subclasses. (As noted by @mikezter.) So you could call the method programmatically from within your sw rather than using the debugger if you really wanted to.
You'll get back a list of instance variables for the current object.
Added: To get a list of the variables used by an .erb file:
# <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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With