我必须忽略一些非常简单的东西,但我似乎无法弄清楚如何使用哈希映射的值渲染一个简单的ERB模板.
来自python的我对ruby比较新.我有一个ERB模板(不是HTML),我需要使用从哈希映射中获取的上下文来渲染,我从外部源接收.
但是,ERB的文档说明该ERB.result方法需要一个binding.我才知道,他们是保持着可变背景的红宝石东西(像locals()和globals()在python,我相信?).但是,我不知道如何从哈希映射中构建绑定对象.
一点点(很多,实际上)谷歌搜索给了我这个:http://refactormycode.com/codes/281-given-a-hash-of-variables-render-an-erb-template,它使用了一些红宝石元编程魔法逃避我
那么,这个问题不是一个简单的解决方案吗?或者是否有更好的模板引擎(不依赖于HTML)更适合这种情况?(我只选择了ERB,因为它在stdlib中).
编辑:忘了包含我的环境信息... Win7x64,RubyInstaller Ruby v1.9.1-p378
编辑2:刚刚更新到v1.9.1,补丁429,仍然得到同样的错误.
编辑3:在Ruby v1.8.7,补丁249中运行相同的代码,工作正常.所以它的v1.9.1明显打破了它.
我是新手使用ERB,我能找到的样品......嗯......不太有帮助......和ERB玩了大约一个小时,我得到了一些基本的例子(最后),但我有不明白为什么这不起作用......
require 'ostruct'
require 'erb'
data = {:bar => "bar"}
vars = OpenStruct.new(data)
template = "foo "
erb = ERB.new(template)
vars_binding = vars.send(:binding)
puts erb.result(vars_binding)
Run Code Online (Sandbox Code Playgroud)
此代码生成以下错误:
irb(main):007:0> puts erb.result(vars_binding)
NameError: undefined local variable or method `bar' for main:Object
from (erb):1
from C:/Ruby/v1.9.1/lib/ruby/1.9.1/erb.rb:753:in `eval'
from C:/Ruby/v1.9.1/lib/ruby/1.9.1/erb.rb:753:in `result'
from (irb):7
from C:/Ruby/v1.9.1/bin/irb:12:in `'
为什么要看main:Object绑定?我告诉它通过传入来使用OpenStruct的绑定vars_binding
有人可以告诉我为什么它不起作用,并帮助我让它工作?
如果我有一个.html.erb看起来像这样的文件:
<html>
<head>
<title>Test</title>
</head>
<body>
<%= @name %>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
如何生成看起来像这样的HTML文件?
<html>
<head>
<title>Test</title>
</head>
<body>
John
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
如果格式为.html.erb并且能够获得.html文件,我该如何执行模板(传递name参数)?