【问题标题】:What is the difference between render and yield in RailsRails中的render和yield有什么区别
【发布时间】:2012-12-31 15:16:39
【问题描述】:

有人可以解释“<%= render %>”和“<%= yield %><% content_for :partial do %>/<% end %>”之间的区别吗?特别是从一个切换到另一个时路由如何变化,使用一个而不是另一个的好处,什么时候使用一个而不是另一个。 THIS 是我找到的最接近的解释,但对我来说还不够清楚。

我已经尝试了几天来解决这个问题,但似乎我尝试的每个配置要么接近,要么出错。

如果存在三个视图,aaabbbccc,并且每个视图都有一个 index.html.erb,但是 bbbccc 有一个 _content.html.erb 部分(由下划线表示)如何你能用renderyieldaaa中获得bbbccc部分吗?

以下作品:

aaa的 index.html.erb :

<div">
  <%= render 'bbb/content' %>
</div>

bbbs _content.html/erb :

<p>Content from bbb.</p>  

但这不是:

aaa的 index.html.erb :

<div">
  <%= yield :container %>
</div>

bbbs _content.html/erb:

<% content_for :container do %>
  <p>Content from bbb.</p>   ### viewed in aaa
<% end>

cccs _content.html.erb 什么都没有,或者content_for,但我仍然没有让aaa 的index.html 填充内容。

如果我使用渲染,我可以明确地将内容放入其中。但我认为使用yield :whatever 的好处将允许我选择填充它的内容,但我无法让它填充任何内容一旦我将它从渲染更改为产量。我还必须更新路由文件吗?如果是这样,我该如何选择用哪一个来填充它?这是否意味着它在控制器中?需要采取行动吗?

虽然我也有这取决于最初路由到哪个文件,但就像我说的那样,我认为我需要先了解两者之间的区别,然后才能开始使用部分文件来发挥我的优势。

【问题讨论】:

标签: ruby-on-rails ruby ruby-on-rails-3


【解决方案1】:

当您的控制器方法退出时,它会呈现关联的文件。所以编辑控制器呈现edit.html.erb。如果未指定,则使用指定的布局或 application.html.erb。

在您的布局文件中,当您调用yield 时,它将填写您渲染中的信息。如果您使用参数调用yield,它将在您的渲染文件中查找与该参数匹配的content_for 部分。我不完全确定,但我认为您不能从布局文件外部调用 yield,而且我认为它不会填写除渲染文件中的信息之外的任何信息。

在您的布局文件或渲染文件中的任何位置,您都可以通过调用 render 来渲染部分,并使用部分名称减去下划线。

希望对你有帮助。

编辑以回答评论中的问题:

yieldrender 执行类似的功能,但是yield 只查看渲染文件,而render 指定要渲染的文件。此外,render 输出整个文件,但带参数的yield 只能输出文件的一小部分。

【讨论】:

  • 你能更好地区分你所谓的layout filerendered file
  • 您能否举一个使用yield/content_for 的示例,该示例也可以使用render 完成,或者两个不同的示例来解释为什么它们不一样?
  • 假设:users 的控制器和:new 的方法在您的控制器中没有调用renderlayout,布局文件位于app/views/layouts/application.html.erb并且渲染文件在 app/views/users/new.html.erb.
  • 所以不能在其他视图中使用yield
  • 这当然不是本意,但与 Rails 中的大多数事情一样,如果你很固执,你可能会找到一种方法。
【解决方案2】:

首先yield是ruby,render是rails。通常,对于内部内容根据操作/上下文而变化的应用程序使用通用布局。问题通常在于定义布局的结束位置和上下文特定模板的开始位置。以HTML title tag 为例。假设您有一个名为 Cities 的应用程序。在大多数情况下,您希望页面标题始终为“城市”。但是,例如,如果您在阿姆斯特丹页面内,那么您希望将“阿姆斯特丹”作为您的页面标题。

# application.html.erb
<html>
  <head>
    <%= content_for?(:page_title) ? yield(:page_title) : "Cities" %>
    ......

# city/index.html.erb
<% content_for :page_title do %>
  <%= @city.name %> 
<% end %>

<div class="bla"...

在 Rails 中,您通常在应用程序布局中定义应用程序标题。更改页面标题的一种策略是在特定城市模板中使用 content_for 并进行相应更改。

另一方面,渲染完成不同的渲染策略。直的。当您调用渲染时,它会渲染。 content_for/yield 不会自动渲染,它存储在某个地方,然后在适当的地方填补缺失的地方。因此,与渲染相比,您可以将其视为“存储/搜索/替换”,后者只是简单的渲染。

一个优于另一个的良好经验法则是:如果您编写的模板需要在每个上下文中呈现不同的信息,强烈考虑使用 content_for。

【讨论】:

  • city/index.html 中的 content_for 不应该类似于 吗?
【解决方案3】:

yield

Ruby 代码(Proc 类)并获取您的代码块并执行它应该做的事情。与其他基于 Ruby 的做同样事情的方式相比,产量也是 fast。 我假设(并且我只)在布局中使用它,因为它很快而且我会不经意地做 Rails 中的正常操作。 yield 还用于将内容传递到布局中的特定位置。我经常在头部有&lt;%= yield :head %&gt;,就在头部标签的上方,这样我就可以传递有时会出现的随机怪异。

常见用途:

  • 主要用于布局
  • (如果您喜欢/倾向于在模型中这样做)作为真正的 Ruby Proc 声明。

render

您向其传递参数的 Rails 代码,正如文档所说,“呈现将作为响应正文返回给浏览器的内容”。部分,动作,文本,文件...等。

常见用途:

用于视图和控制器。

【讨论】:

    猜你喜欢
    • 2016-06-01
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 2018-03-12
    • 2011-07-06
    相关资源
    最近更新 更多