Rolify Gem:用户必须至少拥有一个角色

Rolify Gem: User has to have at least one role

如何使用 rolify gem 验证用户至少存在一个角色?我尝试按照以下方式验证 User.rb 中角色的存在,但它不起作用。

奖金:是否可以不允许管理员用户取消自己的管理员角色?

User.rb:

class User < ApplicationRecord
  rolify
  validates :roles, presence: true
end

编辑表格:

  = form_for @user do |f|
    - Role.all.each do |role|
      = check_box_tag "user[role_ids][]", role.id, @user.role_ids.include?(role.id)
      = role.name
    = f.submit

控制器:

class UsersController < ApplicationController
  before_action :set_user, only: [:edit, :update, :destroy]

  def edit
    authorize @user
  end

  def update
    authorize @user
    if @user.update(user_params)
      redirect_to users_path
    else
      render :edit
    end
  end

  private
  def set_user
    @user = User.find(params[:id])
  end

  def user_params
    params.require(:user).permit({role_ids: []})
  end
end

当用户有 1 个以上的角色时,它工作正常,但如果我取消所有角色,它会报错:

您可以创建自定义验证以要求用户至少具有一个角色:

class User < ActiveRecord::Base
  rolify
  validate :must_have_a_role

  private
  def must_have_a_role
    errors.add(:roles, "must have at least one") unless roles.any?
  end
end 

存在验证实际上只针对属性而不是 m2m 关联。

Is it possible not to permit admin user take off his own Admin role?

这是可能的,但会相当复杂,因为 Rolify 使用 has_and_belongs_to_many 关联而不是 has_many through:,这会让您使用关联回调。