[Ruby on Rails]trueだとvalidation通るのにfalseだとvalidation通らない


フロントエンジニアです
apiのつなぎこみしていて、ハマったので書きます。

結論

boolean型の存在確認にpresence: trueを使うと、
trueだとvalidation通り、falseはvalidionが通らない。

具体例

こんな感じのTaskテーブルがあって、

create_table "tasks", force: :cascade do |t|
  t.string "name", null: false
  t.boolean "is_finished", null: false
  t.datetime "created_at", precision: 6, null: false
  t.datetime "updated_at", precision: 6, null: false
end

こんな感じにis_finishedカラムにpresence: trueをかけているとします。

class Task < ApplicationRecord
  validates :is_finished, presence: true
end

こんなサンプルデータがあって、is_finishedをfalseにしてsaveしようとするとエラリます。

解説

どうやらpresenceは、内部的にblank?メソッドを呼び出しているぽいです。
公式railsのここを見てます。間違ってたらごめんなさい。

で、blank?についてですが、Railsガイドによると、falseはblankと見なされると。

なので、falseだとblank?で引っかかって、エラっていたわけですね。

解決

prsence: trueの代わりにinclusion: { in: [true, false] }を使えば期待通りの挙動になります

まとめ

trueだと通って、falseだと通らない時、validationを確認する。
presenceが使われていたら、inclusion: { in: [true, false] }を代わりに試してみる

以上です。
読んでいただき、ありがとうございます。