ruby Rails 7验证可防止删除AdminUser(如果其最后一个

mwg9r5ms  于 2022-11-04  发布在  Ruby
关注(0)|答案(2)|浏览(140)

我有一个Rails 7应用程序,它的模型是AdminUser。可以有多个管理员,任何人都可以删除其中的任何管理员。我该如何设置验证,以便在数据库中的最后一个AdminUser被删除时阻止它删除的可能性?
简而言之,我希望总是有一个不可删除的AdminUser。

mqkwyuun

mqkwyuun1#

首先,我将添加一个AdminUser#destroyable?,以允许在前端检查是否可以销毁以及是否应该在视图中呈现链接。


# in app/models/admin_user.rb

def destroyable?
  AdminUser.count > 1
end

这可以在如下视图中使用:

<%= link_to(admin_user_path ...) if admin_user.destroyable? %>

然后,您可以在有人尝试销毁最后一个管理员用户时引发异常。


# in app/models/admin_user.rb

before_destoy :do_not_destroy_last_admin

private

def do_not_destroy_last_admin
  raise(
    ActiveRecord::RecordNotDestroyed, "Last admin cannot be deleted" 
  ) unless destroyable?
end
2uluyalo

2uluyalo2#

使用类似before_destroy的回调。

class AdminUser < ApplicationRecord
  before_destroy :check_last
  ...
  private 

  def check_last
    return unless AdminUser.size < 2
    raise ActiveRecord::RecordNotDestroyed, 'Can\'t delete last Admin'
  end
end

相关问题