12

例如: content_for(:stuff)vsyield :stuff

我知道它们的实现方式略有不同,但有什么真正的功能差异吗?

是否有普遍接受的最佳实践?

4

4 回答 4

37

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视图中使用。有一个特殊的第二个用途 for content_for,你不给它块,它返回之前渲染的内容。这主要用于yield无法工作的辅助方法。在您的观点中,最好的做法是坚持yield :my_content回忆内容并content_for :my_content do...end渲染内容。

于 2012-10-31T03:58:56.273 回答
3

屈服:

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

content_for:

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

yield :stuff将抓取被推送的内容content_for(:stuff)

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

您可以通过阅读教程了解更多信息。

于 2012-10-31T03:51:20.367 回答
2

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

于 2016-03-16T19:21:50.903 回答
2

来自 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

于 2018-08-10T14:40:17.343 回答