Rails中render和yield之间的区别是什么

有人可以解释“ ”和“ / ”之间的区别吗? 具体来说,当从一个切换到另一个时,路由如何变化,使用一个优于另一个的好处,何时使用一个优于另一个。 这是我发现的最接近的解释,但对我来说还不够清楚。

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

如果有三个视图, aaabbb以及ccc ,并且每个都有一个index.html.erb ,但是bbbccc有一个_content.html.erb partial(用下划线表示)你怎么能完成获取bbbccc部分在aaa使用render还是yield

以下作品:

aaa的index.html.erb:

 

bbb s _content.html / erb:

 

Content from bbb.

但这不是:

aaa的index.html.erb:

 

bbb s _content.html / erb:

  

Content from bbb.

### viewed in aaa

ccc的_content.html.erb什么都没有,或者content_for ,但是我仍然没有得到aaa的index.html来填充内容。

如果我使用渲染,我可以明确地将内容放入。但我认为使用yield :whatever的好处是yield :whatever都可以让我选择填充它的内容,而且我不能让它尽快填充任何内容我将它从渲染更改为屈服。 我是否还必须更新路线文件? 如果是这样,我该如何选择填充哪一个? 这是否意味着它在控制器中? 并需要一个行动?

我也有,这取决于最初路由到哪个文件,但就像我说的,我想我需要先了解两者之间的区别,然后才能开始使用partials。

首先,产量是ruby,渲染是铁轨。 通常,对于内部内容根据操作/上下文而变化的应用程序,使用公共布局。 问题通常在于定义布局结束的位置以及特定于上下文的模板的开始。 举个例如, HTML标题标签 。 假设您有一个名为Cities的应用程序。 在大多数情况下,您希望页面标题始终为“城市”。 但是,如果您是在阿姆斯特丹页面内,那么您希望将“阿姆斯特丹”作为您的页面标题。

 # application.html.erb   <%= content_for?(:page_title) ? yield(:page_title) : "Cities" %> ...... # city/index.html.erb <% content_for :page_title do %> <%= @city.name %> <% end %> 

在Rails中,您通常会在应用程序布局中定义应用程序标题。 更改页面标题的一种策略是在特定城市模板中使用content_for并相应地进行更改。

另一方面,渲染完成不同的渲染策略。 直行。 当你调用render时,它会渲染。 content_for / yield不会自动呈现,它存储在某处,然后填充到位的丢失点。 因此,与渲染相比,您可以将其视为“存储/搜索/替换”,而渲染只是简单渲染。

使用一个优于另一个的好经验法则是:如果您编写的模板需要在每个上下文中显示不同的信息,请强烈考虑使用content_for。

yield

Ruby代码(Proc类)并采用你的块并完成它应该做的事情。 与其他基于Ruby的方法相比,产量也很快 。 我假设(我只)在布局中使用它,因为它很快,我在Rails中做了一些正常的事情。 yield还用于将内容传递到布局中的特定位置。 我经常在头部,头部标签上方有<%= yield :head %> ,这样我就可以传递有时出现的随机怪异。

常见用途:

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

render

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

常见用途:

用于视图和控制器。

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

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

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

我希望有所帮助。

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

yieldrender执行类似的函数,但yield只在渲染文件中查找,而render指定要渲染的文件。 此外, render输出整个文件,但带参数的yield只能输出文件的子部分。