dependent: :restrict_with_errors
はじめに
データを保存する時であれば、
validates :column, presence: true
などでバリデーションをかけられますが、今回はデータを削除する時にバリデーションをかけたかったので実装しました。
実装
User
の status
が stopped
でなければ削除できないというコードを書きます。
app/models/user.rb
class User < ApplicationRecord
STATUS_STOPPED = 'stopped'.freeze
before_destroy :validate_status_stopped
private
def validate_status_stopped
errors.add :base, 'ユーザーステータスが停止になっていません。'
throw(:abort) if self.status == STATUS_STOPPED
end
end
子要素の存在有無でバリデーションをかける場合
User
が複数の Article
を has_many
している時に、Article
と紐付いている間は削除できないようにする場合、
微妙な解決策
app/models/user.rb
class User < ApplicationRecord
has_many :articles
before_destroy :validate_article_presence
private
def validate_article_presence
errors.add :base, 'まだ記事が残っています。'
throw(:abort) if self.articles.blank?
end
end
上記コードでもちゃんと動作はしますが、before_destroy
を書いたり、そのためにメソッドも作らなければいけません。
子要素の有無で削除する際にバリデーションをかける場合は下記のコードで動きます。
app/models/user.rb
class User < ApplicationRecord
has_many :articles, dependent: :restrict_with_error
end
これだけでちゃんと動くようになる!
似たような名前で restrict_with_exception
というやつがいますが、それとの違いはこちらの記事で詳しくまとまってます。
まとめ
上記でデータを削除する際にバリエーションをかける時ができますので使ってみてください!