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

2024-05-10

我正在使用 Rails 4.0.2,设计并康康康 https://github.com/CanCanCommunity/cancancan。我正在尝试允许管理员创建新用户。管理员用户在用户表中分配有一个布尔字段。

在ability.rb中我有以下内容:

can :manage, :all if user.admin?

遵循一些建议this https://stackoverflow.com/questions/19017978/allowing-admins-to-add-users-with-devise我创建了一个名为 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 %>

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

您已经登录。

我不太确定我在这里出了什么问题,所以任何帮助将不胜感激。


The build_resourceDevise::RegistrationsController( 中的方法github https://github.com/plataformatec/devise/blob/master/app/controllers/devise/registrations_controller.rb ),

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

路线.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

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

allowed_pa​​rams.user 是 PermissibleParams 类中的一个方法,它可能对您来说很方便。

通过将 current_user 传递到方法中,您可以为不同的用户允许不同的参数。

模型/permissed_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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Devise/CanCanCan - 允许管理员创建新用户 的相关文章

随机推荐