簡體   English   中英

Devise / CanCanCan-允許管理員創建新用戶

[英]Devise/CanCanCan - Allow Admin To Create New Users

我正在使用rails 4.0.2, devisecancancan 我正在嘗試允許管理員創建新用戶。 管理員用戶在users表中分配了一個布爾字段。

在Capacity.rb中,我具有以下內容:

can :manage, :all if user.admin?

遵循問題中的一些建議后,我創建了一個名為AdminsController的新控制器,如下所示:

class AdminsController < Devise::RegistrationsController
      def create
        build_resource(sign_up_params)
        if resource.save
          redirect_to admin_editors_path
        else
          clean_up_passwords resource
          respond_with resource
        end
      end

      def new
        build_resource({})
      end
end

我也嘗試配置路由:

  devise_for :users, :skip => [:registrations]
  as :user do
    get 'user/admin' => 'admins#new'
    post 'user/admin' => 'admins#create'
    get 'users/edit' => 'devise/registrations#edit', :as => :edit_user_registration
    post 'users/' => 'devise/registrations#create', :as => :user_registration
    get 'users/cancel' => 'devise/registrations#cancel', :as => :cancel_user_registration
  end

在devise / registrations / edit.html中,我試圖添加一個鏈接以允許用戶創建新用戶,如下所示:

<%= link_to "Create User", user_admin_path %>

問題是該鏈接僅將我重定向到帶有消息的主頁

您已經登錄。

我不太確定自己在這里出了什么問題,因此對您的幫助將不勝感激。

Devise :: RegistrationsController( github上 )中的build_resource方法,

def build_resource(hash=nil)
  self.resource = resource_class.new_with_session(hash || {}, session)
end

通過基於會話構建新資源。 會話中的用戶(在這種情況下)是管理員,並且已登錄。

您要基於用戶類的新用戶實例而不是基於會話創建新用戶。

這樣的事情應該起作用。

class AdminsController < ApplicationController
 def new_user
  authorize! :manage, User
   @user = Users.new
 end
 def create_user
    @user = User.new(permitted_params.user)
    authorize! :manage, User
    if @user.save
     #success
    else
     #error
    end

 end
end

routes.rb

get "admins/new_user" => "admins#new_user", as: :admins_new_user
post "admins/create_user/:id" = "admins/create_user", as: :admins_create_user

鏈接到新用戶

<%= link_to "Create User", admins_new_user_path %>

形成

  <%= form_for(@user, :url => admins_create_user_path) do |f| %>
  #fields and submit
  <% end %>

allowed_pa​​rams.user是PermittedParams類中的方法,可能對您而言很方便。

通過將current_user傳遞給方法,可以為不同的用戶提供不同的參數。

型號/permitted_pa​​rams.rb

class PermittedParams < Struct.new(:params, :current_user)
  def user
    params.require(:user).permit(*user_attributes)
  end
  def user_attributes
    if current_user.admin?
      [:name, :email,:password, :password_confirmation, :role ,:admin]
    else
      [ :name, :email, :remember_me,:password, :password_confirmation, ]
    end
  end
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM