2016-04-10 36 views
0

我有一個組織模型,其中有一個屬性,稱爲org_type。在我的組織形式中,我要求用戶指定他們的組織類型是大學,學院還是其他類型的組織。在我的演出頁面中,如果組織類型是大學或大學,我想顯示一些文本。Rails 4 - 或者如果聲明

我不能得到任何或功能的工作。如果我只是要求檢查一個組織類型,下面例如,它工作正常:

<% if @organisation.org_type == 'University' %> 

如果我要求任何組織類型,它顯示一切即使在測試組織是「其它」:

<% if @organisation.org_type == 'University' or 'College' %> 

上述不起作用。它顯示組織類型爲「其他」的文本。

任何人都可以看到我做錯了什麼嗎?

回答

1

在視圖中的邏輯像冒着變得複雜和難以維護的風險。它總是以對這些情況的一次檢查開始,然後被複制到半打地方,然後情況變爲「單身,大學或自學」,並且你必須找到你使用過的所有地方它。

更好的是將它提取到模型中的方法,然後讓視圖只是詢問模型。

# Organisation model 
def uni_or_college? 
    %w(University College).include? org_type 
end 

# view 
<% if @organisation.uni_or_college? %> 
    ... 
<% end %> 

這也是一個檢驗的方法 - 如果你有測試,確保.uni_or_college?方法返回要的是什麼,如果(當)的要求,改變未來,你有一個安全網,以幫助您重構。

+0

進一步沿着可維護的代碼路徑走一步,最好提取uni_or_college中使用的常量?方法轉換成適當的常量,然後可以引用它。 HIGHER_EDUCATION =%w(大學學院)。 def uni_or_college ?; HIGHER_EDUCATION.include? org_type;結束。 – margo

+0

帕夫林的回答非常好。這也是我所做的。我用它們來寫......如果[「大學」,「大學」]。包括?(org_type)......或預製像Institutions.where(:type => [.. ....])。select(:type).collect {| i | i.type}如果我想從現有記錄 –

+0

@margo構建的列表或組織模型的子類 - 將條件替換爲類型。但一次一步:-) – Pavling

2

如果條件是兩個單獨的條件,則實際上rails會運行在下面。

<% if @organisation.org_type == 'University' or 'College' %> 

@organisation.org_type == 'University'是真的OR'College'

手段,<% if (@organisation.org_type == 'University') || ('College') %>

要克服這種情況,你可以做這樣的事情:

<% if ['University', 'College'].include?(@organisation.org_type) %> 

這將返回如果@organisation.org_type要麼是 '大學' 或 '學院'。其他false