如何只允许管理员创建新用户?

时间:2016-08-17 07:59:15

标签: ruby-on-rails devise cancancan

我正在使用Devise,我希望允许仅限管理员来创建新用户。我已经审核了This,但它看起来已经过时了。我已经尝试了很多可能的答案,但没有任何效果。我正在寻找一个详细的答案,因为我还是一个新手。

管理员在用户表格中标有布尔值我正在努力保持最低限度。

3 个答案:

答案 0 :(得分:1)

最简单的方法是向用户控制器添加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 

希望这就是你要找的东西。如果没有,请进一步详细说明。

答案 1 :(得分:1)

#
# In Users_Controller
#
before_action :check_user_role , only: [:edit , :update , :new, :create] 

def check_user_role
  redirect_to home_path if current_user.role != "Your Role"
end

答案 2 :(得分:1)

你可以通过多种方式实现这一目标。我过去所做的是显示\隐藏视图中的链接和检查控制器中的用户的组合。我假设您有一个表单,其中包含您将提交给用户控制器的用户详细信息。

我已经在下面的一个应用程序中包含了一个控制器。

我要做的第一件事是检查用户是否经过身份验证(我们使用谷歌进行此操作,但如果您已经设置了设计,则您不需要这样做,并且可能已经拥有自己的身份验证)。如果您已登录,Devise将创建current_user对象,其中应该包含您的"角色"属性。在标准用户创建中,您可以检查当前的user.role,如果current_user.role不是1,则只需重定向(我假设1表示管理员)。

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