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)
这个回调有一个问题:
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
| 归档时间: |
|
| 查看次数: |
2317 次 |
| 最近记录: |