我的问题考虑了Rails中的部分处理。我无法得到一些设计决策的理由。
如果我像这样渲染部分:
<%= render partial: 'foo/bar', object: @herbie %>
@herbie是Car类的对象。为什么默认情况下调用bar
而不是car
的局部变量 - 至少在我看来 - 在大多数情况下会更合理。
如果各个部分共享一个公共布局,我每次使用layout: ...
时都必须添加render partial:
。这对我来说很奇怪!是不是更可能有各种各样的部分共享相同的布局然后反过来?在partial中定义布局或在ActiveRecord模型中添加to_layout_path
方法不是更合理吗?
更新
我明白使用部分名称可能会更好,因为这在部分上下文中是众所周知的。但是使用标签:locals和:作为搞砸这个论证。
在实际情况中,我想根据对象的状态使用不同的部分(可以打开或关闭的问题)。我将部分呈现的决定移动到Question.to_partial_path
方法,这似乎很优雅。但是我命名了部分open_question
和closed_question
,这使得部分代码不可读。
如果我考虑不同类型的问题,情况会变得更糟。
我希望在一定程度上我们总是对传入的模型做出一些假设。因此在closed_question
中我确定我得到一个问题 - 因此我希望变量被称为问题。另一方面,我可以想象我们传递了一些不同的东西,只是表现得恰到好处(Duck-typing)。
我对partials的时间意义是,在partial中,应该可以定义给定参数的名称以及使用的布局文件。 参数确实可以通过引入一个对我感觉有点不洁的新变量(question = open_question)来实现。
答案 0 :(得分:1)
当您将参数传递给方法时,无法知道该变量的“名称”是什么。这里的部分渲染方法唯一可以使用的是foo/bar
名称,object
属性和一些模型。
您的模型源于名为@car
的变量,在拨打电话的过程中完全丢失。
在Rails中的惯例是partial中使用的变量与partial本身的名称相同。如果您想要具有非标准行为,则可以覆盖此项:
render(partial: 'foo/bar', locals: { car: @car })
但是,作为一个注释,沿着非标准路径走下去通常是一个坏主意。只要有可能,只需将您的部分重命名以更好地符合您的期望。
答案 1 :(得分:0)
这是相关的:render partial :object vs :locals
文档非常好:http://api.rubyonrails.org/classes/ActionView/PartialRenderer.html
默认设置是在partial之后命名对象。如果你想要明确,你可以使用:as或locals。
render partial: 'foo/bar', locals: {car: @car}
render partial: 'foo/bar', object: @car, as: 'car'