解除Gem:用户必须至少具有一个角色

时间:2019-01-24 00:34:30

标签: ruby-on-rails rolify

如何使用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个以上的角色时,它可以正常工作,但是如果我删除所有角色,则会出现错误:

enter image description here

1 个答案:

答案 0 :(得分: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关联。

  

是否可能不允许管理员用户脱去自己的管理员角色?

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