不满意渲染局部的铁路方式

时间:2013-12-10 22:04:03

标签: ruby ruby-on-rails-3.2 ruby-on-rails-4 renderpartial

我的问题考虑了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_questionclosed_question,这使得部分代码不可读。 如果我考虑不同类型的问题,情况会变得更糟。

我希望在一定程度上我们总是对传入的模型做出一些假设。因此在closed_question中我确定我得到一个问题 - 因此我希望变量被称为问题。另一方面,我可以想象我们传递了一些不同的东西,只是表现得恰到好处(Duck-typing)。

我对partials的时间意义是,在partial中,应该可以定义给定参数的名称以及使用的布局文件。 参数确实可以通过引入一个对我感觉有点不洁的新变量(question = open_question)来实现。

2 个答案:

答案 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'