フロントエンジニアです
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] }
を代わりに試してみる
以上です。
読んでいただき、ありがとうございます。