首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用散列中的值呈现ERB模板

使用散列中的值呈现ERB模板
EN

Stack Overflow用户
提问于 2012-01-22 00:41:51
回答 7查看 45K关注 0票数 67

这里我肯定忽略了一些非常简单的东西,但是我似乎想不出如何用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中)。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-01-22 01:40:53

我不知道这是不是“更优雅”:

代码语言:javascript
复制
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 %>')

或者来自类方法:

代码语言:javascript
复制
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作为模板,听起来像“凉茶”。给事物命名很难。)

票数 61
EN

Stack Overflow用户

发布于 2012-03-16 17:31:06

代码语言:javascript
复制
require 'erb'
require 'ostruct'

def render(template, vars)
  ERB.new(template).result(OpenStruct.new(vars).instance_eval { binding })
end

e.g

代码语言:javascript
复制
render("Hey, <%= first_name %> <%= last_name %>", first_name: "James", last_name: "Moriarty")
# => "Hey, James Moriarty" 

更新:

不使用ERB的简单示例:

代码语言:javascript
复制
def render(template, vars)
  eval template, OpenStruct.new(vars).instance_eval { binding }
end

例如:

代码语言:javascript
复制
render '"Hey, #{first_name} #{last_name}"', first_name: "James", last_name: "Moriarty"
# => "Hey, James Moriarty

更新2: checkout @adam-spiers评论如下。

票数 79
EN

Stack Overflow用户

发布于 2017-05-30 23:45:19

代码语言:javascript
复制
$ ruby -rerb -e 'p ERB.new("Hi <%= name %>").result_with_hash(name: "Tom")'
"Hi Tom"
票数 46
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8954706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档