2016-04-11 7 views
0

私はRailsの4Rails 4 - enumの使い方は?

でアプリを作るしようとしている私は、この質問を投稿してアドバイスを得た: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タグを追加する必要がありますか?私はコード 'enum'の使用経験がありません

答えて

0

あなたは非常に近いです:)修正は誤りです。

あなたの選択は

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

を呼び出すことであり、あなたのエラーは複数形が間違っているかを示します。あなたは、単一のオブジェクト上の列挙を呼び出す場合、それは

@preference.self_governance 

になることを覚えておいてくださいしかし、あなたはモデル自体、好みに呼び出して、コレクションを要求した場合には、複数のです。

Preference.self_governances 

enumは特別なので、uour enumのはだけではなく、ハッシュの、配列することができます:あなたのビューは次のようになり

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]:Arrayのための未定義のメソッド 'humanize 'です。選択行から 'humanise'を削除すると、キーと値の両方を表示するフォームが表示されます。私は値を表示したいが、キーを格納したい。 'enum'は使用しようとする間違ったものですか? – Mel

+0

ハッシュを使用する理由がない場合は、配列に切り替えることができます。非常に多くの場合、列挙型は単純で配列だけです。あなたは単純なキー(番号3のようなもの)を使用しているので、必要な時に配列インデックスを使うことができます(例えば、dbに格納されるもの) – trh

+0

どうすればいいですか?ビューを取得してテキストを表示しようとすると、数値を格納するdb – Mel

0

Railsはあなたのためにenumコレクションを複数化していますので、あなたはself_governancesになります。

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

あなたがenumを使用します。その手段はPreference.self_governancesを定義してハッシュを返すということで、実際に値を保持する属性のような特異@preference.self_governance

例の一つです何

内部で何をするかは、値を持つハッシュを返すように定義した名前を持つ複数のクラスメソッド定義を追加し、あなたが書いたように定義した名前を使用します。実際の値を取得/設定するオブジェクトのインスタンスの列挙値。

別の、一般的な使用はTestクラス与えられ、状態のためである:

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

したがって、上記のサンプルレールは単にあなたの列挙型の値を返すTest.statusesメソッドを追加しますため。その後、Testオブジェクトのインスタンスのために、あなたがうまくいけば、それは理にかなってTest.statuses

によって返されたハッシュからステータスを取得または設定するために使用することができ、あなたの名前の名前でアクセサ@instance.statusを持っているでしょう。

関連する問題