2012-03-16 71 views
1

为什么ERB独立渲染不能用于实例变量?那是“<%= @test_var%>”行的输出为空?为什么ERB独立渲染不能用于实例变量

@test_var = "test variable" 
template = Tilt.new('./app/scripts/email.erb') 
st = template.render 
puts st 

和email.erb

<html> 
<body> 
    <h1>This is it!</h1> 
    <p> 
     Phone Number: <%= @test_var %> 
    </p> 
</body> 
</html> 

<html> 
<body> 
    <h1>This is it!</h1> 
    <p> 
    Phone Number: 
    </p> 

</body> 
</html> 

回答

2

找到了答案......需要有

(一)在我所在班级的实例变量如下:

# Support templating of member data. 
    def get_binding 
    binding 
    end 

(B)也呼吁ERB“运行”时,对象必须传递此方法的结果,例如

rhtml = ERB.new(erb_str) 
html = rhtml.run(get_binding) 
+0

为我工作,你也可以省略函数get_binding并直接传递绑定。我想把字符串作为html,所以我做了'html = rhtml.result(binding)' – portforwardpodcast 2013-06-02 22:57:56

0

试试这个

test_var = "test variable" 
template = Tilt.new('./app/scripts/email.erb') 
st = template.render(self, test_var: test_var) 
puts st 

<html> 
<body> 
    <h1>This is it!</h1> 
    <p> 
     Phone Number: <%= test_var %> 
    </p> 
</body> 
</html> 
+0

这并没有实际工作 - 这给了“'evaluate_source‘:未定义的局部变量或方法'test_var’为”测试变量“:String(NameError)” – Greg 2012-03-16 07:11:46

+1

修复: st = template.render(self,test_var:test_var) – kp666 2014-02-21 07:12:34

+0

谢谢@ kp666。我没有测试,但它有意义 – 2014-02-21 10:12:09

1

今天刚刚开始类似的工作。这是我得到它的工作原理:

template = File.read("path/to/template.html.erb").gsub(/^ /, '') 
rhtml = ERB.new(template) 
@hash_of_all_i_need_in_template = method_to_get_hash_of_all_i_need_in_template 
email_contents = rhtml.result(Proc.new{@hash_of_all_i_need_in_template}) 

希望这有助于!

0

您需要通过结合上下文的模板,你的代码应该是

@test_var = "test variable" 
template = Tilt.new('./app/scripts/email.erb') 
st = template.render(self) 
puts st