14

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

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

如果存在三个视图,aaa并且bbbccc,并且每个视图都有一个index.html.erb,但是bbb并且ccc有一个_content.html.erb部分(由下划线表示),你如何在使用or时完成获取bbbccc部分?aaarenderyield

以下作品:

aaa的 index.html.erb :

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

bbb_content.html/erb :

<p>Content from bbb.</p>  

但这不是:

aaa的 index.html.erb :

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

bbb_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将允许我选择填充它的内容,并且一旦我更改它就无法让它填充任何内容从渲染到产量。我还必须更新路由文件吗?如果是这样,我该如何选择用哪一个来填充它?这是否意味着它在控制器中?需要采取行动吗?

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

4

3 回答 3

11

首先yield是ruby,render是rails。通常,对于内部内容根据操作/上下文而变化的应用程序使用通用布局。问题通常在于定义布局的结束位置和上下文特定模板的开始位置。以HTML 标题标签为例。假设您有一个名为 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。

于 2013-01-17T11:05:31.743 回答
5

yield

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

常见用途:

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

render

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

常见用途:

用于视图和控制器。

于 2013-01-17T11:39:23.810 回答
1

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

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

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

我希望这会有所帮助。

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

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

于 2013-01-17T06:17:43.083 回答