How do I 'validate' on destroy in rails

前端 未结 11 1904
你的背包
你的背包 2020-11-28 06:33

On destruction of a restful resource, I want to guarantee a few things before I allow a destroy operation to continue? Basically, I want the ability to stop the destroy oper

11条回答
  •  醉话见心
    2020-11-28 07:25

    State of affairs as of Rails 6:

    This works:

    before_destroy :ensure_something, prepend: true do
      throw(:abort) if errors.present?
    end
    
    private
    
    def ensure_something
      errors.add(:field, "This isn't a good idea..") if something_bad
    end
    

    validate :validate_test, on: :destroy doesn't work: https://github.com/rails/rails/issues/32376

    Since Rails 5 throw(:abort) is required to cancel execution: https://makandracards.com/makandra/20301-cancelling-the-activerecord-callback-chain

    prepend: true is required so that dependent: :destroy doesn't run before the validations are executed: https://github.com/rails/rails/issues/3458

    You can fish this together from other answers and comments, but I found none of them to be complete.

    As a sidenote, many used a has_many relation as an example where they want to make sure not to delete any records if it would create orphaned records. This can be solved much more easily:

    has_many :entities, dependent: :restrict_with_error

提交回复
热议问题