validationにinclusionを使っているカラムに対して、Enumerizeを適用しようとして少しハマりました。
例えばユーザーの性別を数値型で管理している場合、こんな感じにmodelになると思います。
app/models/user.rb
class User < ApplicationRecord
validate :sex,
presence: true,
inclusion: { in: 0..2 }
end
0: 未設定
1: 男 (male)
2: 女 (female)
ここにEnumerizeを適用するため、以下のように追記しました。
app/models/user.rb
class User < ApplicationRecord
...
validate :sex,
presence: true,
inclusion: { in: 0..2 }
enumerize :sex, in: { male: 1, female: 2 }
...
end
編集用viewは以下のような感じです。
simple_formを使用しています。
app/views/users/edit.slim.html
= simple_form_for @user do |f|
...
.form-control
= f.input :sex, as: :radio_buttons, checked: @user.sex
...
.form-control
= f.submit '登録'
これで male
, female
のラジオボタンができるのですが、一方を選択して[登録]ボタンを押すと、
"is not included in the list"
というエラーが表示されます。
この場合、実際にDBに登録される値は数値の2
ですが、@user.sex
の値は"female"
になるため、もともとあったinclusion
バリデーションに引っかかってします。
元のinclusion
バリデーションを外してEnumerizeに任せるようにすると、正常に登録できるようになります。
app/models/user.rb
class User < ApplicationRecord
...
validate :sex,
presence: true
enumerize :sex, in: { male: 1, female: 2 }
...
end
よく考えると当たり前のことでしたが、解決に小一時間潰してしまいました。