Rails中render和yield之间的区别是什么

时间:2013-01-17 06:03:49

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

有人可以解释&#34; <%= render %>&#34;之间的区别&{34; <%= yield %><% content_for :partial do %> / <% end %>&#34;?具体来说,当从一个切换到另一个时,路由如何变化,使用一个优于另一个的优点,何时使用一个优于另一个。 THIS是我找到的最接近的解释,但对我来说还不够清楚。

我已经尝试了好几天来绕过这个,但似乎我尝试的每个配置都接近或出错。

如果有三个视图,aaabbb以及ccc,每个视图都有index.html.erb,但bbbccc_content.html.erb部分(由下划线表示)如何使用bbbccc完成aaarender部分yield

以下作品:

aaa的index.html.erb:

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

bbb s _content.html / erb:

<p>Content from bbb.</p>  

但这不是:

aaa的index.html.erb:

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

bbb s _content.html / erb:

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

ccc s _content.html.erb没有任何内容,或者content_for,但我仍然没有得到aaa的index.html来填充内容

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

我也有,但这取决于最初路由到哪个文件,但就像我说的那样,我认为在开始使用partials之前我需要了解两者之间的区别。

3 个答案:

答案 0 :(得分:9)

首先,产量是红宝石,渲染是铁轨。通常,对于内部内容根据操作/上下文而变化的应用程序,使用公共布局。问题通常在于定义布局结束的位置以及特定于上下文的模板的开始。举个例子,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并相应地进行更改。

另一方面,

渲染完成不同的渲染策略。直行。当您调用render时,它会呈现。 content_for / yield不会自动呈现,它存储在某处,然后填充到位的丢失点。因此,与渲染相比,您可以将其视为“存储/搜索/替换”,而渲染只是简单渲染。

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

答案 1 :(得分:4)

yield

Ruby代码(Proc类)并接受你的阻塞并做它应该做的事情。与其他基于Ruby的方法相比,产量也是fast。 我假设(我只)在布局中使用它,因为它很快,我在Rails中做了一些正常的事情。 yield还用于将内容传递到布局中的特定位置。我的头部常常有<%= yield :head %>,位于头部标签上方,这样我就可以传递有时出现的随机怪异。

常用用途:

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

render

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

常用用途:

在视图和控制器中使用。

答案 2 :(得分:1)

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

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

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

我希望有所帮助。

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

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