ほげノート

「長編を書くより、短編を数多く完成させてください。それが上達への近道です」 by 手塚治虫

RailsではBoolean型で presence: true が機能しない

試してみる

サンプル用のプロジェクトを作成する。

rails new presence_sample
cd presence_sample

サンプル用のモデルを作成する。

bin/rails g model User name:string is_admin:boolean
bin/rails db:migrate


app/models/user.rbを編集する。

class User < ApplicationRecord
  validates :is_admin, presence: true
end

bin/rails cRailsコンソールを起動する。

user = User.create(name: "hoge", is_admin: false)
user.errors.full_messages
=> ["Is admin can't be blank"]

だめだった。presence: trueだと、falseの値はエラーになってしまう。

is_adminにはfalseの値を入れているけど、"Is admin can't be blank"と返されてしまった。


is_admin: trueだとユーザーを作成できる。なんだこれは…。

user = User.create(name: "hoge", is_admin: true)
   (0.6ms)  begin transaction
  User Create (2.8ms)  INSERT INTO "users" ("name", "is_admin", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["name", "hoge"], ["is_admin", 1], ["created_at", "2019-12-02 11:02:20.604528"], ["updated_at", "2019-12-02 11:02:20.604528"]]
   (1.6ms)  commit transaction


app/models/user.rbを編集する。

class User < ApplicationRecord
  validates :is_admin, inclusion: { in: [true, false] }
end

Railsコンソールでreload!を実行して再起動する。

user = User.create(name: "hoge", is_admin: false)

これでis_adminの値がfalseでもユーザーを作成できるようになった。


まとめ

RailsでBoolean型で入力チェックをしたい時は、以下のように設定する。

validates :is_admin, inclusion: { in: [true, false] }


参考