Rolify Gem: у пользователя должна быть хотя бы одна роль - PullRequest
0 голосов
/ 24 января 2019

Как я могу проверить наличие хотя бы одной роли для Пользователя с помощью 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 голосов
/ 24 января 2019

Вы можете создать пользовательскую проверку, требующую, чтобы у пользователя была хотя бы одна роль:

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:, что позволит вам использовать обратные вызовы ассоциации.

...