例如:content_for(:stuff)
vs yield :stuff
我知道它们的实现略有不同,但有没有真正的功能差异?
是否有普遍接受的最佳做法?
答案 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_for
。 content_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