有人可以解释&#34; <%= render %>
&#34;之间的区别&{34; <%= yield %>
与<% content_for :partial do %>
/ <% end %>
&#34;?具体来说,当从一个切换到另一个时,路由如何变化,使用一个优于另一个的优点,何时使用一个优于另一个。 THIS是我找到的最接近的解释,但对我来说还不够清楚。
我已经尝试了好几天来绕过这个,但似乎我尝试的每个配置都接近或出错。
如果有三个视图,aaa
和bbb
以及ccc
,每个视图都有index.html.erb
,但bbb
和ccc
有_content.html.erb
部分(由下划线表示)如何使用bbb
或ccc
完成aaa
或render
部分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之前我需要了解两者之间的区别。
答案 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 %>
,位于头部标签上方,这样我就可以传递有时出现的随机怪异。
render
您将参数传递给它的Rails代码,正如文档所说,“呈现将作为响应主体返回给浏览器的内容”。部分,动作,文本,文件......等。
在视图和控制器中使用。
答案 2 :(得分:1)
当您的控制器方法退出时,它会呈现关联的文件。因此编辑控制器呈现edit.html.erb。如果没有指定布局,则使用指定的布局或application.html.erb。
在您的布局文件中,当您致电yield
时,它会填充渲染中的信息。如果您使用参数调用yield
,它将在您的渲染文件中查找与该参数匹配的content_for
部分。我不完全确定,但我不认为您可以从布局文件外部调用yield
,我认为它不会填写除渲染文件中的信息之外的任何信息。
在布局文件或渲染文件中的任何位置,您可以通过使用部分名称减去下划线调用render
来渲染部分内容。
我希望有所帮助。
编辑以回答评论中的问题:
yield
和render
执行类似的功能,但yield
只在渲染文件中查找,而render
指定要渲染的文件。此外,render
输出整个文件,但带参数的yield
只能输出文件的子部分。