1
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

Organization

[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しようとするとエラリます。
スクリーンショット 2020-03-14 19.53.40.png

解説

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

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

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

解決

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

まとめ

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
1
Help us understand the problem. What are the problem?