Rails 5 before_destroy throw(:abort)

时间:2018-06-28 02:29:48

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

我正在使用旧版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

2 个答案:

答案 0 :(得分:1)

a catch with this callback

  

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

所以请尝试

before_destroy :check_before_removing!, prepend: true

答案 1 :(得分:1)

尝试做这样的事情

from elasticsearch import Elasticsearch client = Elasticsearch() indexName = "medical" docType = "diseases" searchFrom = 0 searchSize = 3 searchBody = { "fields": ["name"], "query": { "simple_query_string": { "query": '+fatigue+fever+"joint pain"', "fields": ["fulltext", "title^5", "name^10"] } } } client.search( index=indexName, doc_type=docType, body=searchBody, from_=searchFrom, size=searchSize )

before_destroy :check_before_removing, prepend: true