Как разрешить ТОЛЬКО администраторам создавать новых пользователей?

Я использую Devise и хочу разрешить только администраторам создавать новых пользователей. Я уже просмотрел Это ответ, но он выглядит устаревшим. Я пробовал так много возможных ответов, но ничего не получалось. Я ищу немного подробный ответ, так как я все еще новичок.

Администраторы помечаются логическим значением в таблице пользователей. Я стараюсь минимизировать количество вещей.


person Opapadaia    schedule 17.08.2016    source источник


Ответы (3)


Вы можете добиться этого множеством способов. То, что я делал в прошлом, — это комбинация показа\скрытия ссылок в представлениях и проверки пользователя в контроллере. Я предположил, что у вас есть форма с данными пользователя, которую вы отправляете в пользовательский контроллер.

Ниже я включил контроллер из одного приложения, над которым работал.

Первое, что я делаю, это проверяю, аутентифицирован ли пользователь (для этого мы используем Google, но если вы настроили устройство, вам это не понадобится, и, вероятно, у вас будет собственная аутентификация). Devise создаст объект current_user, если вы вошли в систему, который должен включать ваш атрибут «роль». При создании стандартного пользователя вы можете проверить текущую user.role и просто перенаправить, если current_user.role не равен 1 (я предположил, что 1 означает admin).

class UsersController < ApplicationController

  # Set the user record before each action
  before_action :set_user, only: [:show, :edit, :update, :destroy]

  # User must authenticate to use all actions in the users controller  
  before_filter :authenticate_user!

  def create
    if current_user.role = 1 then
      @user = User.new(user_params)
      @user.password = Devise.friendly_token[0,20]

      respond_to do |format|
        if @user.save
          format.html { redirect_to @user, notice: 'User was successfully created.' }
          format.json { render action: 'show', status: :created, location: @user }
        else
          format.html { render action: 'new' }
          format.json { render json: @user.errors, status: :unprocessable_entity }
        end
      end
    else
      format.html { redirect_to @user, notice: 'You do not have sufficient rights to set up a new user.' }
    end
  end

  private

  # Use callbacks to share common setup or constraints between actions.
  def set_user
    @user = User.find(params[:id])

    rescue ActiveRecord::RecordNotFound  
    flash[:notice] = "User record does not exist"
    redirect_to users_url
  end
end
person Mark Davies    schedule 17.08.2016
comment
Я сам добавил пользовательские параметры, и это сработало, я думал, что он унаследует их от контроллера разработки, а затем понял, что этот класс наследуется от класса контроллера приложения. в любом случае спасибо вам. но ваш ответ еще не завершен, в response_to отсутствует конечный тег. отредактируйте его, чтобы отметить как правильный ответ - person Opapadaia; 17.08.2016

Что ж, самый простой способ сделать это — добавить действие before_action к вашему контроллеру пользователей, ограничив создание и редактирование, а также любое другое действие, которое вы хотите, определенными критериями.

before_action :create_user , only: [:edit , :update , :new, :correct_user]  

а затем вы можете определить частный метод создания пользователя

def create_user

    @user=User.find(params[:id])
    redirect_to @user unless @user.criteria == criteria
  end 

Надеюсь, это то, что вы ищете. Если нет, пожалуйста, прокомментируйте с более подробной информацией.

person Shahin    schedule 17.08.2016

person    schedule
comment
Какую ошибку вы получаете сейчас? - person bk chovatiya; 02.09.2016