Devise / CanCanCan – 允许管理员创建新用户

我正在使用rails 4.0.2,设计和cancancan 。 我正在尝试允许管理员创建新用户。 管理员用户在users表中分配了一个布尔字段。

在ability.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中,我试图添加一个链接,允许用户创建一个新用户,如下所示:

  

问题是该链接只是将我重定向到带有消息的主页

您已登录。

我不太确定我在这里遇到了什么问题,所以任何帮助都会非常感激。

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

 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