2008-11-12 60 views
7

在我的模型中,有很多属性和方法根据模型实例的属性执行一些计算。如果计算所依赖的属性为零,我一直让方法返回nil。作为这个设计决定的结果,我在我的视图中显示这些值之前做了很多无核查。我应该避免在Rails视图中检查零吗?

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

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

回答

8

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

但是,如果你的业务逻辑导致你陷入其中许多观点会习惯性地空的状态,那么你或许应该重构,使得你的程序失去了它的漏抽象。

考虑,例如,其开始通过跟踪食谱Food的应用程序。然后,随着需求的变化,我们得到馅饼的概念需要显示不同于汉堡的信息。而不是有一个calculate_deliciousness_of_pie_or_nil_for_burger方法,然后在视图中检查零,我会把它分成饼图和汉堡的汉堡视图。这可能(可能会)需要重新思考我的对象抽象。

3

“我做了很多零检查我的意见显示这些值之前。”

我想返回nil是一个好主意。我有时使用的另一种方法是返回散列。例如,如果方法成功了,我可能会返回:

{:result => 1234} 

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

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

这使得它微不足道的决定胜负没有猜测。

虽这么说,请确保您创建的helper方法来调用这些方法并检查他们的结果。视图应该包含很少的逻辑。所以,与其这样做是为了控制结果是否显示:

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

你应该这样做:

<% display_some_method %> 

和#display_ some_方法位于应用程序/佣工/ whatever_helper.rb。

+1

你应该在上面的例子中使用==。 – maurycy 2008-12-26 20:00:31

1

我用两种方法攻击这个问题。

我尝试将更严格的检查转移到模型中。例如,方法Apartment#address_visible?(current_user)使它更清洁。

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

+0

如果你不在2.3也有andand http://github.com/raganwald/andand – 2009-02-18 03:20:02