我应该避免在Rails视图中检查零吗?
在我的模型中,有很多属性和方法根据模型实例的属性执行一些计算。如果计算所依赖的属性为零,我一直让方法返回nil。作为这个设计决定的结果,我在我的视图中显示这些值之前做了很多无核查。我应该避免在Rails视图中检查零吗?
我想到有这些方法返回零,而不是零的时候,他们没有足够的信息,但我选择了零,因为零是一个有效的计算结果和零意味着没有足够的信息。
我应该返回0而不是零吗?有没有其他模式可以用来避免在我的视图中执行一堆零检查?
我倾向于认为你正在做正确的事情,如果你的问题是选择是否显示或不显示,计算的结果。如果显示任何价值都没有意义,那么零是完全合理的。
但是,如果你的业务逻辑导致你陷入其中许多观点会习惯性地空的状态,那么你或许应该重构,使得你的程序失去了它的漏抽象。
考虑,例如,其开始通过跟踪食谱Food
的应用程序。然后,随着需求的变化,我们得到馅饼的概念需要显示不同于汉堡的信息。而不是有一个calculate_deliciousness_of_pie_or_nil_for_burger
方法,然后在视图中检查零,我会把它分成饼图和汉堡的汉堡视图。这可能(可能会)需要重新思考我的对象抽象。
“我做了很多零检查我的意见显示这些值之前。”
我想返回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。
我用两种方法攻击这个问题。
我尝试将更严格的检查转移到模型中。例如,方法Apartment#address_visible?(current_user)
使它更清洁。
由于Rails 2.3也有#try
方法,只有在方法已经定义的情况下才调用方法。它可以使用chris'example轻松包含到您的项目中。这是最简单的情况。
如果你不在2.3也有andand http://github.com/raganwald/andand – 2009-02-18 03:20:02
你应该在上面的例子中使用==。 – maurycy 2008-12-26 20:00:31