2016-04-13 23 views
0

は、私は最近、これらの2つの質問を求めてきましたRailsの4Railsの4 - キーと値のペア

でアプリを作成しよう、と応答にアドバイスを取っています。 Rails 4 - how to use enum?

私はまだ苦労しています。

私は、入力セレクタを持つフォームがあります。

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

私はこれを保存し、それをしようとすると、選択メニューが表示さ:

[ "TIER_1"、1]

何を希望は、ディスプレイに次のとおりです。ティア1

瞬間、私は好みのモデルを持っている:

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 
         }   

私は好みのビューを表示します:

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

、私は(今のところ)形式の問題を受け入れ、ショーのページをレンダリングしようとすると、私はこのエラーを取得:

'["tier_1", 1]' is not a valid self_governance 

誰かが私が間違って行ったことを見ることができますか?

数字1をデータベースに保存するだけですが、単語 'Tier 1'を表示します。

答えて

1

フォームを更新して、enumからキーと値のコレクションを正しく返します。私たちはただの出力を見れば

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

Preference.self_governances.map { |key, val| [key.humanize, key] }

私たちは以下のようになります。Preference.self_governancesはちょうどキーと値を反復、むしろコールto_aよりハッシュobject.rのタイプである

最初の値が selectラベルとして表示する内容であり、第二の値は param以内にあなたのコントローラに送信されます何であることを
[ 
    ["Tier 1", "tier_1"], 
    ["Tier 2", "tier_2"] 
    ... 
] 

注意。

EDIT:

列挙型を使用して、キーまたはフィールドに列挙型の値のいずれかを割り当てることができます。

preference.self_governance = 1 # Works 
preference.self_governance = :tier_1 # Works 
preference.self_governance = "tier_1" # Works 

しかし、あなたは文字列として値を代入することはできません。

preference.self_governance = '1' 
=> "ArgumentError: '1' is not a valid self_governance" # Doesn't work, tries to look for key '1' in enum, but doesn't exist. 

だから、あなたが選択した列挙型(すなわち「TIER_1」)のキーを渡す作るフォームに驚いたりそれ以外の場合は

+0

アンソニーに感謝します。それはフォームで機能しましたが、私がsubmitを押すと、「1」は有効なself_governanceではないというエラーが表示されます – Mel

+0

ああ、そうです。値を整数に変換します。これは、列の型(val.to_i)に一致します。 –

+0

今はお試しいただきありがとうございます。 – Mel

関連する問題