是否可以使用ERB库评估html.erb模板中的yield语句?

时间:2016-05-23 17:50:02

标签: ruby-on-rails ruby erb

我所指的ERB库是ERB

require 'ERB'
simple_template = "Statement: <%= yield %>."
renderer = ERB.new(simple_template)

我希望能够传入一个块,以便在yield中的simple_template语句中使用。有没有办法用ERB库做到这一点?

以下不起作用:

renderer.result { "I am yielded" }  # LocalJumpError: no block given (yield)

也不是:

prc = Proc.new { "I am yielded" }
renderer.result(prc) # TypeError: wrong argument type proc (expected binding)

有没有比使用ERB库更好的方法呢?

这个问题似乎是指application.html.erb中的Rails应用程序中发生的事情。

更新: 以下是我发现的问题重复: yield in ERB without rails

1 个答案:

答案 0 :(得分:1)

您需要将您想要的块传递给上下文,其中您创建了您将与模板一起使用的Binding

require 'erb'


def render(name)
  TEMPLATE.result(binding)
end

render('evianpring') { 'blocks' }
# => "evianpring yields to the power of blocks!"

让我们深入了解其工作原理。来自绑定文档:

  

Binding类的对象将执行上下文封装在某些对象中   代码中的特定位置并保留此上下文以供将来使用。   变量,方法,self的值,以及可能的迭代器块   在这种情况下可以访问的都被保留。

那么绑定的执行上下文中可用的内容是在这里创建的吗?

def render(name)
  TEMPLATE.result(binding)
end
  • #render() name的本地变量,如TEMPLATE
  • #render()
  • 这样的全局变量
  • 我们传递给#render()
  • 的任何块

因此,如果我们想要使用yield,则需要将块传递给const f1= () => { const a = 1; const f2 = () => a; return f2; };