Shrikant Sharat Shrikant Sharat - 1 year ago 133
Ruby Question

Render an ERB template with values from a hash

I must be overlooking something very simple here but I can't seem to figure out how to render a simple ERB template with values from a hash-map.

I am relatively new to ruby, coming from python. I have an ERB template (not HTML), which I need rendered with context that's to be taken from a hash-map, which I receive from an external source.

However, the documentation of ERB, states that the

method takes a
. I learnt that they are something that hold the variable contexts in ruby (something like
in python, I presume?). But, I don't know how I can build a binding object out of my hash-map.

A little (a lot, actually) googling gave me this:, which uses some ruby metaprogramming magic that escapes me.

So, isn't there a simple solution to this problem? Or is there a better templating engine (not tied to HTML) better suited for this? (I only chose ERB because its in the stdlib).

Answer Source

I don't know if this qualifies as "more elegant" or not:

require 'erb'
require 'ostruct'

class ErbalT < OpenStruct
  def render(template)

et ={ :first => 'Mislav', 'last' => 'Marohnic' })
puts et.render('Name: <%= first %> <%= last %>')

Or from a class method:

class ErbalT < OpenStruct
  def self.render_from_hash(t, h)

  def render(template)

template = 'Name: <%= first %> <%= last %>'
vars = { :first => 'Mislav', 'last' => 'Marohnic' }
puts ErbalT::render_from_hash(template, vars)

(ErbalT has Erb, T for template, and sounds like "herbal tea". Naming things is hard.)