1. ホーム
  2. ruby-on-rails

[解決済み] railsでdestroy時に'validate'を行うには?

2023-06-24 14:07:57

質問

restful リソースの破壊時に、破壊操作の継続を許可する前に、いくつかのことを保証したいのですが。基本的に、私は、そうすることがデータベースを無効な状態に置くことに注意した場合、destroy 操作を停止する機能が欲しいのです。destroy操作には検証コールバックがないので、destroy操作を受け入れるべきかどうか、どのように検証するのでしょうか?

どのように解決するのですか?

例外を発生させて、それをキャッチすることができます。Railsは削除をトランザクションで包むので、それが役に立ちます。

例えば

class Booking < ActiveRecord::Base
  has_many   :booking_payments
  ....
  def destroy
    raise "Cannot delete booking with payments" unless booking_payments.count == 0
    # ... ok, go ahead and destroy
    super
  end
end

別の方法として、before_destroyコールバックを使用することもできます。このコールバックは通常、依存するレコードを破棄するために使用されますが、 代わりに例外をスローしたり、エラーを追加したりすることができます。

def before_destroy
  return true if booking_payments.count == 0
  errors.add :base, "Cannot delete booking with payments"
  # or errors.add_to_base in Rails 2
  false
  # Rails 5
  throw(:abort)
end

myBooking.destroy は false を返すようになり myBooking.errors は返されたときに入力されます。