#はじめに
レコード削除時に関連づけられたレコードが存在するときに、例外やエラーを発生させたい。
外部キーで使用されていると親要素が消されては困るというシチュエーションです。
削除しようとするとRubyのエラー画面が出てしまう。
#原因
Model
に関係づけされたモデルに対する挙動を定義するが無いからでした。
マイグレーションファイルのforeign key: True
だけでは不十分でした。
#対策
Model
にdependentオプション
を記述することで解決しました。
該当のモデルに以下の記述をします。
#contractというモデル
class Contract < ApplicationRecord
has_many :...., dependent: :restrict_with_error
end
アソシエーション記述の後にdependent: :restrict_with_error
と記述することでdestory
できないときのエラーを表示することができた。
以下の条件分が成り立ち解決しました!。
#contractというモデルのコントローラー
def destroy
contract = Contract.find(params[:id])
if contract.destroy
redirect_to contract_path, notice: "選んだ契約を削除しました"
else
redirect_to contract_path, alert: "使用中のため削除できません"
end
end
#参照
・https://dorarep.page/articles/rails-dependent#dependent_restrict_with_exception_restrict_with_error