【问题标题】:Is it possible to evaluate a yield statement in an html.erb template using the ERB library?是否可以使用 ERB 库评估 html.erb 模板中的 yield 语句?
【发布时间】:2016-05-23 17:50:01
【问题描述】:

我指的ERB库是ERB

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

我希望能够传入一个块以在simple_templateyield 语句中使用。有没有办法用 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

【问题讨论】:

  • 您只是想执行逻辑并将其排除在您的视图文件之外吗?
  • 我正在尝试实际实现我自己的(更基本的)Rails Web 框架版本,这涉及呈现由基本 application.html.erb 类型视图和另一个视图形成的视图被插入到 yield 语句中。

标签: ruby-on-rails ruby erb


【解决方案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()的任何块

因此如果我们想使用yield,需要将一个块传递给#render()

【讨论】:

  • 关于绑定的文档并没有说明如何使用块 (ruby-doc.org/core-2.2.0/Binding.html)。为什么这不起作用(假设您之前在某处定义了变量名):TEMPLATE.result(binding { "blocks" })。这会生成 LocalJumpError: no block given (yield)。这是绑定的东西还是我在块内放置收益时缺少的 Ruby 东西?
  • 我实际上犯了一个错误。我最初在那里的收益电话是多余的。
猜你喜欢
  • 2019-08-12
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
  • 2012-05-27
  • 1970-01-01
相关资源
最近更新 更多