2016-04-11 66 views
0

我試圖讓on Rails的4Rails 4 - 如何使用枚舉?

的應用程序,我張貼了這個問題,並得到了一些建議:Rails 4 -Simple Form how to save key and display value

我想弄清楚如何實施這個建議。

目前,我有一個嗜好模型:

enum self_governance: { 
          tier_1: 1, 
          tier_2: 2, 
          tier_3: 3, 
          tier_4: 4, 
          tier_5: 5 
         } 

    enum autonomy: { 
          tier_11: 1, 
          tier_21: 2, 
          tier_31: 3, 
          tier_41: 4, 
          tier_51: 5 
         }   

在我的偏好形式,我有:

<%= f.input :self_governance, as: :select, label: "Select your governance approach", collection: Preference.self_governance.to_a.map { |p| [p.humanize, p] } %> 

我有一個偏好表明觀點:

<%= @organisation.preference.self_governance.try(:humanize) %> 

當我保存所有這一切,並嘗試它,我得到這個錯誤:

NoMethodError at /preferences/1/edit 
undefined method `self_governance' for #<Class:0x007fde5b9fb500> 
Did you mean? self_governances 

任何人都可以看到如何使這項工作?

我是否需要在偏好模型中的枚舉中添加def/end標籤?我沒有任何使用代碼枚舉的經驗

回答

0

你太親近了:)解決方法是正確的錯誤。

你的選擇是調用

Preference.self_governance.to_a.map { |p| [p.humanize, p] } 

而你的錯誤告訴你的多元化是錯誤的。請記住,如果你調用一個枚舉單個對象上,這將是

@preference.self_governance 

但如果你調用模型本身,偏好,並要求收集它的複數。

Preference.self_governances 

因爲enum是特殊的,uour枚舉的可能僅僅是數組,而不是散列:

enum self_governance: [ tier_1, tier_2, tier_3, tier_4, tier_55 ] 

enum autonomy: [ tier_11, tier_21, tier_31, tier_41, tier_51 ] 

你的看法會是這樣的:

<%= f.input :self_governance, as: :select, label: "Select your governance approach", collection: Preference.self_governances.map { |key, value| [key.humanize, key] } %> 

它將存儲的索引號陣列,就像神奇:)

+0

謝謝!這工作,但現在我得到這個錯誤:未定義的方法'人性化'爲[「tier_1」,1]:數組。當我從選擇行中刪除'humanise'時,我會得到一個顯示鍵和值的表單。我只想顯示價值,但存儲密鑰。 '枚舉'是錯誤的嘗試使用? – Mel

+0

如果你沒有使用散列的理由,你可以切換到一個數組,很多時候枚舉的數組很簡單,只是一個數組。由於您使用的是簡單的鍵(如數字3),因此您可以在需要時使用數組索引(例如,這將存儲在數據庫中) – trh

+0

我該怎麼做?我只是試圖讓視圖顯示文本和數據庫來存儲號碼 – Mel

0

Rails將枚舉集合複用爲你,因此你的例子可能是self_governances

這也就意味着,Preference.self_governances將返回與定義和實際持有的價值屬性的哈希是一個奇異像@preference.self_governance

一個例子:

@preference = Preference.new 
@preference.self_governance = Preference.self_governances[:tier_1] 

當您使用enum內部要做什麼Rails會添加一個複數類方法定義,其中定義的名稱將返回一個帶有值的散列值,並且將使用您定義的名稱,就像您寫的那樣,屬性訪問器將會得到/設置實際枚舉值對象的實例。

另外,常見的用途是地位,賦予了Test類:

enum status: { 
    active: 1, 
    inactive: 2 
} 

因此,對於上面的示例軌道將增加一個Test.statuses方法,簡單地返回您的枚舉值。然後,對於Test對象的實例,你將有你的名字的名稱,你可以用它來獲得或者從Test.statuses

希望這是有道理的返回的哈希設置狀態的訪問@instance.status