“yield”是什么意思?

3

What does yield do in ruby on rails?

<body data-spy="scroll" data-target=".sidebar">
  <!-- Your timezone is <%= Time.zone %> -->
  <!-- <%= "Ruby Version is #{RUBY_VERSION}" if Rails.env =~ /test|development/ %> -->
  <%= render partial:'shared/account_status' %>
  <%= render partial:"shared/session_timeout" %>
  <div class="container">
    <%= render partial:"shared/branding" %>
    <%= render partial:"shared/nav", locals:{icons:icons, actionable_urls:actionable_urls, top_level_items:MenuItem.top_level_items_with_access_rights_for_user(current_user).sort{|a, b| a.sequence <=> b.sequence}, current_item:current_navigation_item} %>
    <div style="clear:both"></div>
    <div id="content">
      <%= render partial:"shared/flash", object:flash %>
      <%= yield %>
    </div>

  </div>
  <%= render partial:"shared/ldap_user_menu" if signed_in_as_ldap_user?  %>
</body>

“在 Ruby on Rails 中,yield 做什么?” — 它做的事情与纯 Ruby 中一样。会向块传递控制权。这不是 Rails 特有的。 - Aleksei Matiushkin
它加载页面内容。 - Gautam Kathrotiya
4个回答

4
它告诉Rails将你的视图内容放在该布局文件中的该块(由yield调用)的位置。请查看Rails指南以了解有关ActionView的更多信息。
https://guides.rubyonrails.org/action_view_overview.html
如@Aleksei Matiushkin所指出的那样,yield是纯Ruby语言,因此您还应该自行学习更多相关内容。
这里是(我的)可视化演示,以解释该行发生的情况:
view.html.erb:
<p>Hello there!</p>
<p>I'm a content from view</p>

layout.html.erb:

<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
    <%= yield %>
  </body>
</html>

现在的结果将会像这样:
<!DOCTYPE html>
<html>
  <head>
  </head>

  <body>
    <p>Hello there!</p>
    <p>I'm a content from view</p>
  </body>
</html>

3
这并不涉及到 Rails。Rails 和 yield 没有任何关系。ERB 是纯 Ruby,而 yield 也是纯 Ruby。 - Aleksei Matiushkin
Rails是基于Ruby的框架。yield是Ruby语言的一部分。Ruby告诉Rails==它告诉Rails。他想知道在那行代码中yield做了什么,而不是yield是什么。对于造成的困惑,我很抱歉。感谢您的指正。 - vpibano
1
@piabano,你写的并没有错。但是只有在OP能够追踪Rails代码以了解它在Rails视图系统特定上下文中的实现方式时,才是正确的。而在这种情况下,OP本来就不会首先提出这样的问题。 - sawa

1
你的问题不够具体。在Rails中,与普通的Ruby一样,在方法定义中使用yield表示传递给方法的块。
然而,从你提供的代码块来看,你似乎特别想问关于在Rails视图布局中使用的yield。在这种情况下,它代表在上下文中呈现的视图文件中描述的主要内容。例如,当控制器是Foo,操作是bar时,用于此类上下文中的布局中使用的yield将被/app/views/foo/bar.html(或其他格式的相应视图文件)的内容替换。

1
它仍然是 ERB 实现中块的调用。 - Aleksei Matiushkin

0

在概念上,它必须简单明了: yield 是将动作视图中的内容块(HTML)放置到布局模板中的位置。 例如:动作索引呈现 index.html,结果将被放置/填充到 yield 中。


0

我在其他答案中没有看到提到render,所以我想补充一下@vipibano的答案。如果你想了解Rails中这个yield是如何工作的(更具体地说是在application.html.erb中),你会受益于以下几点:

  1. 理解Ruby中块的工作原理(正如其他人所提到的)
  2. 理解Rails的render方法的作用

render方法在控制器操作的末尾被调用,并协调将哪个块传递给实际呈现application.html.erb的方法。

我试图将其可视化,并且有一些示例,如果您想深入挖掘,请参阅相应的帖子:

https://richstone.io/debunk/

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接