ActionView 中的 Yield 魔法是如何发挥作用的?

2023-12-10

I was 看着content_for 是如何工作的并观察到block.call in the capture_erb_with_buffer方法。它显然神奇地写入了缓冲区变量,然后该变量被修剪。但是,我认为这已被弃用,您可以致电<%=yield :tag%>现在。这是如何运作的?如果我从 ERB 模板调用yield,那么yield会到哪里?

一个简单的代码示例来说明这一点将不胜感激。


我不确定如何yield在 ERB 级别上起作用,但我确实知道它在应用于布局时如何工作。

这是一个示例layout.html.erb文件:

<html>
  <head>
    <title> <%= @title || 'Plain Title' %> </title>
    <%= yield :head %>
  </head>
<body>
  <div id='menu'>
    <%= yield :menu %>
  </div>
  <div id='content'>
    <%= yield %>
  </div>
  <div id='footer'>
    <%= yield :footer %>
  </div>
</body>

我定义了 4 个产量(:head、:menu、:footer 和 default)和一个实例变量@title。

现在控制器操作可以渲染插入这些点的视图。请注意,视图在布局之前渲染,因此我可以在视图中定义像 @title 这样的变量,并在布局中定义它。

视图示例: 关于页面

<% @title = 'About' %>
<% content_for :menu do %>
  <%= link_to 'Back to Home', :action => :home %>
<% end %>

We rock!

<% content_for :footer do %>
  An Illinois based company.
<% end %>

编辑页面

<% @title = 'Edit' %>
<% content_for :head do %>
  <style type='text/css'> .edit_form div {display:inline-block;} </style>
<% end %>

<% form_for :thing, :html => {:class => 'edit_form'} do |f| %>
   ...
<% end %>

您可以混合和匹配您想要放入数据的产量以及发生的情况content_for :something将被插入到匹配的yield :something在布局文件中。

它甚至适用于部分,部分可以插入自己的 content_for :something 块,该块将与任何其他 content_for 调用一起添加。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ActionView 中的 Yield 魔法是如何发挥作用的? 的相关文章

随机推荐

  • textarea onclick 删除文本

    我知道如何删除简单的 html 文本框中的文本 但 html 文本区域似乎要复杂得多 您可以将文本放在以下位置之间 而不是 value 属性
  • boost::property_tree::info_parser 在值中的空格处中断

    我面临一个问题 我有一个配置文件 我用 boost property tree info parser 解析它 我使用这段代码来完成这项工作 struct Config std string info 2 boost property tr
  • 网页脚本和内容脚本以及main.js(附加代码)脚本之间的通信[重复]

    这个问题在这里已经有答案了 UPDATE 抱歉 这个例子有效 我发现了一个小错误并在我的完整源代码中修复了 但我还是希望比我更了解的人能够很好地回答这个关于如何实现网页脚本和内容脚本以及main js 附加代码 脚本之间的通信的问题 还请回
  • 使用amazonSNS移动推送时如何确认配送状态?

    我正在使用 AmazonSNS 将推送消息发送到 IOS 设备 我已经得到带有 messageID 的publishResult 有什么办法可以使用这个messageID来检查传递状态吗 无法确认消息是否已送达 但是 看起来有一种方法可以在
  • Array() = range().value

    I saw array range value在一个例子中 我试图理解它是如何工作的 Sub test Dim arr As Variant arr Range E5 E7 Value For i 0 To UBound arr Debug
  • Excel VBA 中的 for 循环

    我正在尝试在 Excel 列上使用 For 循环 这是我的代码 For Each c In Worksheets sheet1 Range A1 A5000 Cells c Offset 0 1 Range A1 Value Right L
  • Linq连接iquery,如何使用defaultifempty

    我写了一个 linq 连接查询 如果其中一个为空 我想获取这些值 Code var Details UnitOfWork FlightDetails Query Join PassengersDetails x gt x Flightno
  • Angular CLI 不会创建新项目

    我正在尝试通过 Angular cli 创建一个项目 名为 ngadmin 但它会在此命令上引发错误 ng new ngadmin 错误是 fs 不支持重新评估本机模块源 如果你是 使用graceful fs模块 请将其更新到更新版本 版本
  • 将文本拆分为段落 NLTK - nltk.tokenize.texttiling 的用法?

    我正在寻找将文档分成段落的方法 我遇到了文本平铺作为一种可能的方法来做到这一点 这是我使用它的尝试 但是 我不明白如何处理输出 我很感激你的帮助 t unidecode doclist 0 decode utf 8 ignore nltk
  • 如何从数据库中随机检索问题?

    我有以下代码
  • 从 HTTP 切换到 HTTPS,失去了所有 Facebook“点赞”

    切换到 https 后 我们所有的文章都失去了 Facebook 的 点赞 计数 因此 我想仅对我们网站的内容区域禁用 https 该区域位于 content php 文章采用 content php 212 My Article 的形式
  • 检查自定义 Twig 函数是否存在,然后调用它

    我测试是否存在自定义 Twig 函数 if methodExist sg datatables render sg datatables render datatable else datatable render datatable en
  • Webview 的 loadData() 在 android 10.0 中不起作用(Q)

    这里我试图将 Html 代码作为字符串加载到 webview 中loadData 此方法没有发生任何事情 但相同的方法在低于 sdk 29 中像魅力一样工作 webview loadData html code text html null
  • Beam/Dataflow 中的批量 PCollection

    我在 GCP Dataflow Apache Beam 中有一个 PCollection 我不需要一一处理 而是需要 按N 组合 就像是grouped N 因此 在有界处理的情况下 它将按批次中的 10 个项目和最后一批中剩余的项目进行分组
  • Java + SSH + Postgres

    我们正在实施一个大学项目 Java 的拼车服务 我们需要解决一个与 如何管理 postgres 服务器 相关的问题 PostgreSQL 数据库配置在名为 golem 130 136 4 sth 的实验室服务器中 只能通过同一子网 130
  • 关于Scala变量可变性的问题

    我明白那个val关键字确定基础变量是不可变类型 以后不能重新分配 现在我在 scala 编程中遇到了一段 第 3 章 scala 中的后续步骤 用类型参数化数组 它指出 val greetStrings Array String new A
  • 等待光标并禁用 java 应用程序

    我想让用户按下按钮来启动后台线程 当线程正在处理时 我希望发生两件事 1 应显示 WAIT CURSOR 2 应用程序不应响应鼠标事件 根据setCursor 文档 当该组件的 contains 方法针对当前光标位置返回 true 时 将显
  • Swift:无法在某些闭包中分解元组(例如,通过枚举减少)?

    当使用map 和enumerate 时 Swift将分解枚举元组 map enumerate 1 2 3 index element in index element 然而 这似乎不能与额外的闭包参数一起使用 例如 使用reduce red
  • 相同的视图控制器加载两次

    我读过关于这个问题的几篇文章 但没有一个能解决我的问题 我正在编写一个应用程序 我必须单击一个按钮 准备 才能转到以下 ViewController 单击按钮时 它还会在两个视图控制器之间传递数据 问题是 当我单击按钮时 以下 ViewCo
  • ActionView 中的 Yield 魔法是如何发挥作用的?

    I was 看着content for 是如何工作的并观察到block call in the capture erb with buffer方法 它显然神奇地写入了缓冲区变量 然后该变量被修剪 但是 我认为这已被弃用 您可以致电现在 这是