我一定忽略了一些非常简单的东西,但我似乎不知道如何使用哈希映射中的值来呈现一个简单的ERB模板.

我对ruby比较陌生,来自python.我有一个ERB模板(不是HTML),我需要使用从外部源接收的哈希映射中获取的上下文来呈现它.

然而,ERB的文件指出,ERB.result方法需要binding.我了解到它们是ruby中保存变量上下文的东西(我猜是python中的locals()globals()?).但是,我不知道如何从哈希映射中构建绑定对象.

用谷歌搜索一下(实际上是lot)我得到了这个:http://refactormycode.com/codes/281-given-a-hash-of-variables-render-an-erb-template,它使用了一些我无法理解的ruby元编程魔法.

那么,这个问题不是有一个简单的解决方案吗?或者有更好的模板引擎(不与HTML绑定)更适合这种情况吗?(我 Select ERB只是因为它在stdlib中).

推荐答案

我不知道这是否符合"更优雅"的条件:

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代表模板,听起来像"草药茶".命名东西很难.)

Ruby相关问答推荐

这是按引用传递/值传递的误解,导致此方法无法按预期输出吗?

删除带括号的子表达式

Ruby 是否提供了一种使用指定编码执行 File.read() 的方法?

什么是 '?-mix' 在 Ruby 正则表达式中

用于 ruby​​ gems 的新 10.9 OSX 的命令行工具?

在一组字符串中找到最长的公共起始子字符串

Ruby:如何判断字符是大写还是小写

Rails 控制台中没有数据库连接

以条件方式构建哈希

为什么在 ruby​​ / rails / activerecord 中并不总是需要 self ?

你能在 Python 的核心类型上修改补丁方法吗?

如何在课堂上使用 Enumerable mixin?

ruby 中&:运算符的功能是什么?

在类方法中使用实例变量 - Ruby

判断整数是否在范围内

如何在 IRB 中重新加载脚本?

为什么compass watch说它无法加载 sass/script/node (LoadError)?

当我们导入 csv 数据时,如何消除UTF-8 中的无效字节序列

从 'mm/dd/yyyy' 格式解析 ruby​​ DateTime

如何在ruby脚本中隐藏终端的密码输入