LoginSignup
2
0

More than 5 years have passed since last update.

Enumerize と inclusion validationを同時に使ってハマる

Last updated at Posted at 2017-12-08

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"というエラーが表示されます。

image.png

この場合、実際に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

よく考えると当たり前のことでしたが、解決に小一時間潰してしまいました。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0