0

如何重構Ruby on Rails代碼的這一點?重構一系列值的條件

def select_plan 
     unless params[:plan] && (params[:plan] == '1' || params[:plan] == '2' || params[:plan] == '3' || params[:plan] == '4' || params[:plan] == '5' || params[:plan] == '6' || params[:plan] == '7' || params[:plan] == '8') 
      flash[:notice] = "Please select a membership plan to register." 
      redirect_to root_url 
     end 
    end 
+0

有效計劃編號從何而來?他們來自數據庫嗎?有什麼常數可以定義它們嗎?他們是否在整個代碼中都灑滿了神奇的數字? –

+0

我問,因爲擁有「6是一個有效的計劃」,事實上只坐在一個控制器方法或幾個不同的地方是你需要重構的東西,而不是你在'select_plan'中執行的繁瑣實現。修復潛在的問題,'select_plan'會將自身清理爲副作用。 –

+0

@ muistooshort - 請原諒我的經驗水平。有效的計劃編號出現在數據庫中。我對你要說的事感興趣。雖然我不完全確定你的意思。 –

回答

0

如果計劃數是在數據庫中有一個Plan模型,那麼你可以簡單地這樣說:

@plan = Plan.find_by(:id => params[:plan]) 
if([email protected]) 
    flash[:notice] = "Please select a membership plan to register." 
    redirect_to root_url 
end 

現在您可以訪問下一個視圖的完整計劃詳細信息,以便您可以向他們顯示名稱,說明,價格......以及計劃的存在僅存儲在一個位置(即數據庫)中。如果你不需要@plan,那麼你可以說:

if(!Plan.where(:id => params[:plan]).exists?) 
    ... 
end 

重要的一點是,應該只有一兩件事,知道有效的計劃是什麼,你需要知道的關於計劃的任何時候,你問這個一件事,只有一件事。

是最終調用select_plan也將使用數據庫(而不是字面值數字一至八),以獲得有效的計劃的看法:

<% Plan.order(...).each do |p| %> 
    whatever you need to display the plan as an option... 
<% end %> 

添加一個新的計劃,以數據庫和一切仍然有效。刪除/禁用計劃,一切仍然有效。您的軟件將更容易維護,缺陷更少,更容易理解,並且您將獲得新的好習慣而不是壞習慣。

+1

我感謝您花時間解釋並提供適當的RoR示例。我已經實施了第一個解決方案。 –

3

我會這樣做。

def select_plan 
    unless params[:plan].in?('1'..'8') 
    flash[:notice] = "Please select a membership plan to register." 
    redirect_to root_url 
    end 
end 

或者像畝太短建議:請Plan一個真實的東西。這可能是一個數據庫模型或只是一個小Ruby類:

# in app/models/plan.rb 
require 'set' 
class Plan 
    VALID_PLANS = Set.new('1'..'8').freeze 

    def self.valid_plan?(plan) 
    VALID_PLANS.include?(plan) 
    end 
end 

# used like 
def select_plan 
    unless Plan.valid_plan?(params[:plan]) 
    flash[:notice] = "Please select a membership plan to register." 
    redirect_to root_url 
    end 
end 
+0

我認爲你錯過了這裏的真正問題。 「我如何重寫這個'if語句'是表面問題,真正的問題是」我怎麼知道'params [:plan]'是否是一個有效的計劃「。 –

+0

@ muistooshort,我不明白。在我看來,這兩者都有。 –

+0

@CarySwoveland:假設一個「計劃」是應用程序的基本部分,因此將控制器方法中的可用計劃編號作爲幾個幻數關閉,這是一個非常糟糕的主意。應該有某種'Plan'模型知道有效的計劃編號是什麼,然後如果'params [:plan]'有效並且'Plan'可能會諮詢一個數據庫,那麼控制器會問'Plan'。作爲一個孤立的代碼是好的,但它在整個應用程序的背景下味道不好。 –