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