2008-11-12 63 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