5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

フロントエンジニアです
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] }を代わりに試してみる

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

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?