【问题标题】:What does “yield” do?“收益”有什么作用?
【发布时间】:2019-03-22 19:42:06
【问题描述】:

yield 在 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>

【问题讨论】:

  • yield 在 ruby​​ on rails 中做了什么?”——它在纯 Ruby 中做的完全一样。产生于块。它不是特定于 Rails 的。
  • 它加载页面内容。

标签: ruby-on-rails yield


【解决方案1】:

它告诉 Rails 把你的视图内容放到布局文件中那个位置的这个块(由yield 调用)。

查看 rails 指南以了解有关 ActionView 的更多信息。
https://guides.rubyonrails.org/action_view_overview.html

正如@Aleksei Matiushkin 所指出的,yield 是纯红宝石,因此您还应该在自己的时间了解更多关于它的信息。

这是一个(我的)视觉演示来解释该行发生的事情:

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>

【讨论】:

  • 它没有告诉任何 Rails。 Rails 与yield 无关。 ERB 是纯红宝石,yield 是纯红宝石。
  • Rails 是一个基于 ruby​​ 的框架。 yield 是红宝石。 Ruby 告诉 Rails == 它告诉 Rails。他在问yield在那一行做了什么。不是yield 是什么。我很抱歉造成混乱。谢谢你的收获。
  • @piabano 你写的没有错。但是,只有当 OP 有能力追踪 Rails 代码以弄清楚它是如何在 Rails 视图系统的特定上下文中实现时才是正确的,在这种情况下,OP 一开始就不会回答这样的问题。
【解决方案2】:

您的问题不够具体。在 Rails 中,与普通 Ruby 一样,在方法定义中使用的yield 表示传递给方法的块。

但是,从您提供的代码块来看,您似乎特别想询问 Rails 中视图布局中使用的yield。在这种情况下,它表示要在上下文中呈现的视图文件中描述的主要内容。例如,当控制器是Foo,动作是bar,那么,在这种上下文中使用的布局中使用的yield将被/app/views/foo/bar.html的内容(或任何相应的视图文件)替换其他格式)。

【讨论】:

  • 而且它仍然是对底层 ERB 实现的块的调用。
【解决方案3】:

在您的概念中必须很简单:yield 是将内容块 (html) 从操作视图放置到布局模板的位置 例如:action index 渲染index.html,结果将被放入/填充到yield

【讨论】:

    猜你喜欢
    • 2019-09-19
    • 2010-10-04
    • 2016-12-21
    • 2018-02-22
    • 2010-09-06
    • 2016-12-14
    • 2017-05-30
    • 2012-09-16
    相关资源
    最近更新 更多