【问题标题】:Rails 5 before_destroy throw(:abort)Rails 5 before_destroy throw(:abort)
【发布时间】:2018-06-28 02:29:48
【问题描述】:

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

我一直在读到 return false 已被弃用,我们都应该使用 throw :abort 但两者都不起作用。我没有收到任何错误,尽管throw

,连接记录还是被删除了

user.rb:

class User < ApplicationRecord
  has_many :permission_users
  has_many :permissions, through: :permission_users, dependent: :destroy
end

加入模型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

我的规格:

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

【问题讨论】:

  • 有点跑题了,但是:expect{}.to change{}.by(0) -> expect{}.not_to change{}
  • 我实际上精简了规范以专注于问题。我实际上正在测试 2 个不同的值不会改变,显然 rspec 不喜欢 .to_not change { ... }.and change { ... } 但谢谢

标签: rspec callback ruby-on-rails-5 has-and-belongs-to-many


【解决方案1】:

a catch with this callback

before_destroy 回调应该放在从属之前: :destroy 关联(或使用 prepend: true 选项),以确保它们执行 在依赖项删除记录之前: :destroy.

所以请尝试

before_destroy :check_before_removing!, prepend: true

【讨论】:

  • 除非我做错了什么,否则这仍然无法正常工作。同样的失败,仍然到达throw(:abort) 并且在throw 之后的日志没有被打印出来,所以我知道它当时正在抛出或其他什么
【解决方案2】:

尝试做这样的事情

before_destroy :check_before_removing, prepend: true

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    相关资源
    最近更新 更多