Help us understand the problem. What is going on with this article?

[Rails]外部キー制限かかっているときにdestoryできないエラーを発生させたい時の対処

はじめに

レコード削除時に関連づけられたレコードが存在するときに、例外やエラーを発生させたい。
外部キーで使用されていると親要素が消されては困るというシチュエーションです。

削除しようとするとRubyのエラー画面が出てしまう。

原因

Modelに関係づけされたモデルに対する挙動を定義するが無いからでした。
マイグレーションファイルのforeign key: Trueだけでは不十分でした。

対策

Modeldependentオプションを記述することで解決しました。
該当のモデルに以下の記述をします。

#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

yamato1491038
30代からエンジニアを目指す💻接客業やマーケティング経験、またフリーで動画編集など 現在スクールにて初心者から学ぶ 簡単な内容からですが学んだことを発信して行きたいと思います☺️
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした