来自 application.html.erb 的 Rails 渲染实例变量
Posted
技术标签:
【中文标题】来自 application.html.erb 的 Rails 渲染实例变量【英文标题】:Rails rendering instance variable from application.html.erb 【发布时间】:2013-11-13 21:29:22 【问题描述】:我正在关注使用 Rails 4 进行敏捷 Web 开发这本书,但我对渲染的部分感到有些困惑。问题的简单版本是......在 application.html.erb 文件中它说
render @cart
这令人困惑,因为我认为需要有一个与该视图关联的控制器才能知道要使用哪个部分变量和 @cart 变量。这条线是否只是通过命名约定来寻找像_cart.html.erb这样的部分?在那种情况下,它实际上不知道@cart 是什么,直到它呈现那个部分?
一些澄清会很可爱。谢谢!
【问题讨论】:
api.rubyonrails.org/classes/ActionView/PartialRenderer.html。对于任何努力寻找有关该主题的简洁信息的人来说,这是一个很好的资源。还解释了与将实例变量作为局部变量传递相关的其他概念。 【参考方案1】:这是一种简写语法。 From the docs:
每个部分还有一个与部分同名的局部变量(减去下划线)。您可以通过 :object 选项将对象传递给此局部变量:
<%= render partial: "customer", object: @new_customer %>
在客户部分中,客户变量将引用父视图中的@new_customer。
如果你有一个模型实例要渲染成一个局部,你可以使用简写语法:
<%= render @customer %>
假设 @customer 实例变量包含 Customer 模型的实例,这将使用 _customer.html.erb 来呈现它,并将局部变量 customer 传递给将引用 @customer 实例变量的部分父视图。
【讨论】:
所以如果模型中有:customer,你可以用户渲染@customer,它不传递任何信息,只是寻找一个名为_customer的部分? 它查找名为 _customer 的部分,并传递从父视图定义的名为@customer
的实例变量。在我回答的第一个示例中,他们展示了如何传入不同的实例变量@new_customer
,但如果您有同名的实例变量,则可以使用简写。
我认为 application.html.erb 是父视图。在 application.html.erb 中渲染 @cart
,变量 @cart
应该根据访问的视图而改变。因此对于索引操作,@cart 将是索引控制器中定义的任何内容。不过,我有点猜测:)以上是关于来自 application.html.erb 的 Rails 渲染实例变量的主要内容,如果未能解决你的问题,请参考以下文章
Rails 不使用 application.html.erb
我将如何在 application.html.erb 的 Rails 中显示不同的标题?
如何不对应用程序中的特定页面使用 application.html.erb 文件?
未为特定控制器加载 application.html.erb 的 css