Rails
RubyOnRails
Enumerize

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

More than 1 year has passed since last update.

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

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