11

I am looking for a way to pass options to the ERB templating engine in thors template action.

I stumbled upon the bundler cli source where thors template action is being used like this:

opts = {:name => name, 
    :constant_name => constant_name, 
    :constant_array => constant_array, 
    :author_name => author_name, 
    :author_email => author_email
}

template(File.join("newgem/Gemfile.tt"),
           File.join(target, "Gemfile"),
            opts)

But when I add options like this in my thor tasks they are not found by ERB, i can only use arguments and functions in my thor class to set variables in the template.

I have no clue how binding works in ruby, maybe there is a way to pass a scope through binding to ERB.

Henrik
  • 9,714
  • 5
  • 53
  • 87
devboy
  • 242
  • 2
  • 8

2 Answers2

14

By using instance variables, it should work.

@name = name
template("source","target")

My template looks like this:

<test><%= @name %></test>

This works for me. I haven't tried the passing of specific values.

Dr. Simon Harrer
  • 1,954
  • 1
  • 15
  • 26
12

I can't find any documentation to answer this, but reading through the source of the Bundler CLI, it appears that if you were trying to reference the :author_email parameter inside the template,

Author email: <%= config[:author_email] %>

works.

workergnome
  • 556
  • 5
  • 18
  • 2
    This work for me too. The hash of `opts` passed to `template` is called `config` in the Erb template. – Kris Oct 07 '11 at 09:55