Rails content_for和yield有什么区别?

时间:2012-10-31 03:47:02

标签: ruby-on-rails

例如:content_for(:stuff) vs yield :stuff

我知道它们的实现略有不同,但有没有真正的功能差异?

是否有普遍接受的最佳做法?

4 个答案:

答案 0 :(得分:21)

yield是指定内容区域在布局中的位置。你可能有这样的事情:

<div>
  <h1> This is the wrapper!</h1>
  <%= yield :my_content %>
</div>

content_for是指定将哪些内容呈现到哪个内容区域的方式。你可能有这样的事情:

<% content_for :my_content do %>
  This is the content.
<% end %>

结果将是

<div>
  <h1> This is the wrapper!</h1>
  This is the content.
</div>

它们是呈现过程的两端,yield指定内容的位置,content_for指定的实际内容

  

是否有普遍接受的最佳做法?

最佳做法是在布局中使用yield,在视图中使用content_forcontent_for有一个特殊的第二个用途,你不给它任何块,它返回先前渲染的内容。这主要用于yield无效的辅助方法。在您的观看中,最佳做法是坚持yield :my_content来回忆内容,并content_for :my_content do...end来呈现内容。

答案 1 :(得分:2)

产率:

  

yield标识视图中的内容应该是的部分   插入

content_for:

  

content_for方法允许您将内容插入到命名的yield中   阻止您的布局。例如,此视图适用于   您刚刚看到的布局:

yield :stuff将抓取content_for(:stuff)

推送的内容

因此,使用yield您可以在视图/布局中定义部分,并使用content_for将内容添加到这些部分。任何未命名的yield都会获取所有其他内容。

您可以阅读tutorial了解有关它的更多信息。

答案 2 :(得分:1)

调用#content_for会在标识符中存储一个标记块供以后使用。为了在其他模板,帮助器模块或布局中访问此存储的内容,您可以将标识符作为参数传递给content_for。 yield仍可用于检索存储的内容,但调用yield并不适用于帮助程序模块,而content_for可以...更多:http://api.rubyonrails.org/classes/ActionView/Helpers/CaptureHelper.html#method-i-content_for

答案 3 :(得分:1)

从Ruby on Rails API中:

  

调用content_for将标记块存储在标识符中,以备后用。为了访问其他模板,帮助程序模块或布局中的此存储内容,您可以将标识符作为参数传递给content_for

     

注意:yield仍可用于检索存储的内容,但是在辅助模块中调用yield无效,而content_for则有效。

     

然后您可以在模板中的任何位置使用content_for :not_authorized

<%= content_for :not_authorized if current_user.nil? %>
  

这等效于:

<%= yield :not_authorized if current_user.nil? %>
  

content_for也可以在帮助程序模块中使用。

https://api.rubyonrails.org/classes/ActionView/Helpers/CaptureHelper.html#method-i-content_for