1. ホーム
  2. ruby-on-rails

[解決済み] Rails 4.1でのselectからのenumの保存

2022-08-30 21:26:37

質問

Rails 4.1のenumを使って、ワインの色を記録しています。

ワイン.rb

class Wine < ActiveRecord::Base
    enum color: [:red, :white, :sparkling]
end

私のビューでは、ユーザーが特定の色のワインを選択できるように、セレクトを生成しています。

f.input :color, :as => :select, :collection => Wine.colors

これにより、以下のようなHTMLが生成されます。

<select id="wine_color" name="wine[color]">
  <option value=""></option>
  <option value="0">red</option>
  <option value="1">white</option>
  <option value="2">sparkling</option>
</select>

しかし、フォームを送信すると、次のような引数エラーが表示されます。 '1' is not a valid color . これは color と同じでなければならないからです。 1 と等しく、かつ "1" .

Railsが色を文字列ではなく、整数として解釈するように強制する方法はありますか?

どのように解決するのですか?

どうやら、保存するenumの整数値を送ってはいけないようです。enumのtext値を送ればいいのです。

という入力に変更しました。

f.input :color, :as => :select, :collection => Wine.colors.keys.to_a

となり、以下のようなHTMLが生成されました。

<select id="wine_color" name="wine[color]">
  <option value=""></option>
  <option value="red">red</option>
  <option value="white">white</option>
  <option value="sparkling">sparkling</option>
</select>

値は "0" から "red" になり、これで準備は整いました。


普通のrailsのtext_fieldを使っている場合はそうなります。

f.select :color, Wine.colors.keys.to_a


もし、人間が読めるきれいな属性を持ちたいのであれば、それも可能です。

f.select :color, Wine.colors.keys.map { |w| [w.humanize, w] }