From: Jeremy Wells Date: 2006-12-09T01:12:14+09:00 Subject: Re: insert into erb binding Ah ok, I get it but here is the problem, which I didn't specify... @variable2 doesn't hold static data, it holds an object, which is created in the render method like so: def render @variable2 = Object.new eval("@variable2 = ????", @binding) That's what I meant by the variable not being in the binding, thus not accessible to eval. Jan Svitok wrote: > On 12/8/06, Jeremy Wells wrote: >> surely this won't work as the binding in my case is coming from an >> external source, so the ruby in the eval won't have access to the >> variable in the render method? > > So once more: The trick is to use eval with binding as an additional > argument. > That means when eval gets a binding as the second argument, it will > operate > in that context. In this case, if you eval("@var = 123", > some_binding), the variable @var will be set in that binding. > > Beware that you are modifying the original binding, so you might > corrupt the original caller. > Maybe @binding = apply_binding.dup will be neccessary. > > (I added @ in the template - it was missing) > > require 'erb' > > # TEMPLATE = "<%=@variable1%> <%=variable2%>" > TEMPLATE = "<%=@variable1%> <%=@variable2%>" > > class Renderer > def initialize(template_file, apply_binding) > @file = template_file > @binding = apply_binding > end > > def render > # @variable2 = "There" > eval("@variable2 = \"There\"", @binding) > > # template = ERB.new(File.read(@file)) > template = ERB.new(TEMPLATE) > > template_results = template.result(@binding) > > # Perform on template results > > template_results > end > end > > require 'test/unit' > > class TestERB < Test::Unit::TestCase > def test_variable > @variable1 = "Hello" > > renderer = Renderer.new('template.xml', binding) > assert_equal "Hello There", renderer.render > end > > end > -- *Jeremy Wells* Serval Systems Ltd. www.servalsystems.co.uk Tel: 01342 331940 Fax: 01342 331950