Rails 5 before_destroy throw(:abort)

Spa*_*lex 5 rspec callback has-and-belongs-to-many ruby-on-rails-5

我正在使用旧版 Rails 应用程序,该应用程序已随 Rails 的每个主要版本进行了认真升级,目前我们使用的是 Rails 5.1,before_destroy如果验证失败,我将无法阻止删除

我一直在阅读return false已被弃用的内容,我们都应该使用,throw :abort但都没有工作。我没有收到任何错误,尽管连接记录被删除throw

用户.rb:

class User < ApplicationRecord
  has_many :permission_users
  has_many :permissions, through: :permission_users, dependent: :destroy
end
Run Code Online (Sandbox Code Playgroud)

加入模型permission_user.rb:

class PermissionUser < ApplicationRecord
  belongs_to :user
  belongs_to :permission

  before_destroy :check_before_removing!

  private

  def check_before_removing!
    if not_valid? # condition isn't important
      errors.add :base, exception.message
      throw(:abort)
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我的规格:

specify "cannot have their admin permissions revoked" do
  expect {
    admin.permissions.delete admin_permission
  }.to change { admin.permissions.count }.by(0)       
end

# => expected `admin.permissions.count` to have changed by 0, but was changed by -1
Run Code Online (Sandbox Code Playgroud)

Grz*_*orz 7

这个回调有一个问题

before_destroy 回调应放置在 dependent: :destroy 关联之前(或使用 prepend: true 选项),以确保它们在 dependent: :destroy 删除记录之前执行。

所以请尝试

before_destroy :check_before_removing!, prepend: true
Run Code Online (Sandbox Code Playgroud)


小智 5

尝试做这样的事情

before_destroy :check_before_removing, prepend: true

def check_before_removing if true && some_condition throw(:abort) end end