[英]Devise/CanCanCan - Allow Admin To Create New Users
我正在使用rails 4.0.2, devise和cancancan 。 我正在嘗試允許管理員創建新用戶。 管理員用戶在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_params.user是PermittedParams類中的方法,可能對您而言很方便。
通過將current_user傳遞給方法,可以為不同的用戶提供不同的參數。
型號/permitted_params.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.