Rails中render和yield之间的区别是什么
有人可以解释“ ”和“
与
/
”之间的区别吗? 具体来说,当从一个切换到另一个时,路由如何变化,使用一个优于另一个的好处,何时使用一个优于另一个。 这是我发现的最接近的解释,但对我来说还不够清楚。
我已经尝试了几天来绕过这个,但似乎我尝试的每个配置要么接近,要么出错。
如果有三个视图, aaa
和bbb
以及ccc
,并且每个都有一个index.html.erb
,但是bbb
和ccc
有一个_content.html.erb
partial(用下划线表示)你怎么能完成获取bbb
或ccc
部分在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
部分。
我希望有所帮助。
编辑以回答评论中的问题:
yield
和render
执行类似的函数,但yield
只在渲染文件中查找,而render
指定要渲染的文件。 此外, render
输出整个文件,但带参数的yield
只能输出文件的子部分。