我应该避免在Rails视图中进行nil检查吗?

时间:2008-11-12 07:23:52

标签: ruby-on-rails ruby

在我的模型中,有许多属性和方法可以根据模型实例的属性执行一些计算。如果计算所依赖的属性为零,我一直在使用返回nil的方法。作为这个设计决定的结果,我在我的视图中显示这些值之前做了很多零检查。

当我们没有足够的信息时,我想过让这些方法返回零而不是nil,但是我选择了nil,因为零是一个有效的计算结果,而nil意味着没有足够的信息。

我应该返回0而不是nil吗?我可以使用任何其他模式来避免在我的视图中进行一堆零检查吗?

4 个答案:

答案 0 :(得分:8)

如果您的问题是选择是否显示或不显示计算结果,我倾向于认为您正在做正确的事情。如果显示任何值都没有意义,那么nil是完全合理的。

但是,如果你的业务逻辑导致你进入一个大部分视图习惯空白的状态,那么你可能应该进行重构,使你的程序失去漏洞的抽象。

例如,考虑一个应用程序,该应用程序首先跟踪Food的配方。然后,随着需求的变化,我们得到了需要显示与汉堡不同的信息的馅饼的概念。我没有使用calculate_deliciousness_of_pie_or_nil_for_burger方法,然后在视图中检查nil,而是将其分解为饼图的饼图和汉堡的汉堡视图。这可能(可能会)需要重新考虑我的对象抽象。

答案 1 :(得分:3)

“在我的观点中显示这些值之前,我正在做很多零检查。”

我认为回归零是一个好主意。我有时使用的替代方法是返回哈希。例如,如果方法成功,我可能会返回:

{:result => 1234}

如果方法“失败”,我可能会返回:

{:error => 'Insufficient attributes to calculate result.'}

这使得在不猜测的情况下确定结果变得微不足道。

说到这一点,请确保创建帮助方法来调用这些方法并检查其结果。视图应包含非常少的逻辑。因此,而不是这样做来控制是否显示结果:

<% if result = some_method -%>
  Your result is <%=h result -%>.<br />
<% end -%>

你应该这样做:

<% display_some_method %>

和#display_ some_方法位于app / helpers / whatever_helper.rb。

答案 2 :(得分:2)

这个问题可能会让你对零或零模式有所了解:

Best Ruby idiom for “nil or zero”

答案 3 :(得分:1)

我使用两种方法来解决这个问题。

我尝试将更苛刻的检查移到模型中。例如,方法Apartment#address_visible?(current_user)使其更清晰。

从Rails 2.3开始,还有#try方法只有在已经定义的情况下调用方法。它可以使用chris'example轻松地包含在您的项目中。这是最简单的情况。