Это неправильное исключение.
ActiveRecord::RecordInvalid
повышается, когда запись недействительна. Довольно понятно.
class Country < ApplicationRecord
validates_presence_of :name
end
irb(main):001:0> Country.create
(0.7ms) BEGIN
(0.2ms) ROLLBACK
=> #<Country id: nil, name: nil, created_at: nil, updated_at: nil>
irb(main):002:0> Country.create!
(0.3ms) BEGIN
(0.4ms) ROLLBACK
ActiveRecord::RecordInvalid: Validation failed: Name can't be blank
from (irb):2
Как вы можете видеть, он не поднимается при вызове .create
- но когда вы вызываете методы "взрыва" .save!
и .create!
.
То, что вы можете искать, это ActiveRecord::RecordNotFound
.
irb(main):001:0> Country.find(1)
Country Load (0.5ms) SELECT "countries".* FROM "countries" WHERE "countries"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]]
ActiveRecord::RecordNotFound: Couldn't find Country with 'id'=1
from (irb):1
irb(main):002:0> Country.find_by(id: 1)
Country Load (0.9ms) SELECT "countries".* FROM "countries" WHERE "countries"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]]
=> nil
irb(main):003:0> Country.find_by!(id: 1)
Country Load (0.7ms) SELECT "countries".* FROM "countries" WHERE "countries"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]]
ActiveRecord::RecordNotFound: Couldn't find Country
from (irb):3
Как видно из этого примера, он не поднимается на .find_by
- скорее он просто возвращает ноль. Если вы хотите вызвать исключение, вам нужно использовать .find_by!
. То же самое относится к динамическим искателям .