这里我肯定忽略了一些非常简单的东西,但是我似乎想不出如何用hash-map中的值来呈现一个简单的ERB模板。
我是ruby的新手,来自python。我有一个ERB模板(不是HTML),我需要用上下文呈现它,该上下文取自我从外部源接收的散列映射。
但是,ERB的文档指出,ERB.result
方法需要一个binding
。我了解到它们是包含ruby中的变量上下文的东西(我猜是不是像python中的locals()
和globals()
?)。但是,我不知道如何从我的hash-map中构建绑定对象。
我用谷歌搜索了一下(实际上是很多次)就得到了这个:http://refactormycode.com/codes/281-given-a-hash-of-variables-render-an-erb-template,它使用了一些我想不到的ruby元编程魔力。
那么,这个问题没有一个简单的解决方案吗?或者,有没有更好的模板引擎(不绑定到HTML)更适合这个?(我选择ERB只是因为它在stdlib中)。
发布于 2012-01-22 01:40:53
我不知道这是不是“更优雅”:
require 'erb'
require 'ostruct'
class ErbalT < OpenStruct
def render(template)
ERB.new(template).result(binding)
end
end
et = ErbalT.new({ :first => 'Mislav', 'last' => 'Marohnic' })
puts et.render('Name: <%= first %> <%= last %>')
或者来自类方法:
class ErbalT < OpenStruct
def self.render_from_hash(t, h)
ErbalT.new(h).render(t)
end
def render(template)
ERB.new(template).result(binding)
end
end
template = 'Name: <%= first %> <%= last %>'
vars = { :first => 'Mislav', 'last' => 'Marohnic' }
puts ErbalT::render_from_hash(template, vars)
(ErbalT有Erb,T作为模板,听起来像“凉茶”。给事物命名很难。)
发布于 2012-03-16 17:31:06
require 'erb'
require 'ostruct'
def render(template, vars)
ERB.new(template).result(OpenStruct.new(vars).instance_eval { binding })
end
e.g
render("Hey, <%= first_name %> <%= last_name %>", first_name: "James", last_name: "Moriarty")
# => "Hey, James Moriarty"
更新:
不使用ERB的简单示例:
def render(template, vars)
eval template, OpenStruct.new(vars).instance_eval { binding }
end
例如:
render '"Hey, #{first_name} #{last_name}"', first_name: "James", last_name: "Moriarty"
# => "Hey, James Moriarty
更新2: checkout @adam-spiers评论如下。
发布于 2017-05-30 23:45:19
$ ruby -rerb -e 'p ERB.new("Hi <%= name %>").result_with_hash(name: "Tom")'
"Hi Tom"
https://stackoverflow.com/questions/8954706
复制相似问题