Rails 5 before_destroy throw (: abort) - PullRequest
0 голосов
/ 28 июня 2018

Я работаю в устаревшем приложении 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

присоединиться к моделиmission_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

1 Ответ

0 голосов
/ 28 июня 2018

Есть улов с этим обратным вызовом :

before_destroy обратные вызовы должны быть помещены перед зависимым:: destroy ассоциации (или используйте параметр prepend: true), чтобы убедиться, что они выполняются прежде чем записи будут удалены зависимым:: уничтожить.

Поэтому, пожалуйста, попробуйте

before_destroy :check_before_removing!, prepend: true
...