我所指的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
答案 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;
};