Cancan + Devise,最佳的管理员管理用户方式

4

我正在开发一个应用程序,公司管理员应该能够创建和更新他公司的用户。(用户也可以独立地创建和更新他们的账户)。

我使用了 Devise 和 Cancan 进行注册和权限管理。我配置了 Devise 来获取所需的注册和用户更新过程。我为管理员视图创建了一个命名空间。

我的管理员控制器(/app/controllers/admin/base_controller.rb)如下所示:

class Admin::BaseController < ApplicationController
  authorize_resource :class => false
  layout 'admin'

  def dashboard
  end
end

除了我的“常规”用户控制器外,我还有一个专门用于管理管理员用户的控制器(/app/controllers/admin/users_controller.rb)和相关视图。

class Admin::UsersController < Admin::BaseController
  ...
end

现在,实现与Devise相关的用户管理功能(此时,创建和更新用户)的最清晰方法是什么?

  1. 在我的“常规”registrations_controller和confirmations_controller中有一个条件(基于用户权限),以呈现和重定向不同的视图?(参见在不同控制器中使用Devise表单

  2. 还是在我的admin命名空间中创建新的控制器?如果后者更好,需要遵循哪些主要步骤?

1个回答

1

这里存在一个问题,一旦您将任何用户管理命名空间或移动到另一个控制器中,您就超出了Devise的范围。因此,在您处于Admin :: UsersController 时,Devise不关心您做什么,也没有像您所说的那样与Devise相关的管理员功能。如果您愿意,可以将Admin :: UsersController 实现为标准的RESTful控制器。

通过命名空间控制器创建用户,Devise仍将执行确认等操作。在以这种方式创建和更新用户时,请记住一件小事。如果您不设置管理员密码,则必须从params哈希中删除passwordpassword_confirmation。要这样做,您的create update 操作的开头将如下所示:

if params[:user][:password].blank?
  params[:user].delete(:password)
  params[:user].delete(:password_confirmation)
end

我在许多应用程序中都采用了同样的方法,但从未失败过。

编辑

namespace :admin do
  resources :users
end

谢谢解释!您能说明在这种情况下路由会是什么样子吗? - alex
我在 "devise_scope :user do" 下添加了 "get "'/manage/users' => 'admin/users#index'" 和 "get 'manage/users/new' => 'admin/users#new'",但是发现必须为每个操作添加路由有点奇怪... 有没有更简洁的方法让它工作? - alex
你不应该继承Devise :: RegistrationsController,而应该继承ActionController :: Base。在这种情况下,你根本不需要使用 Devise,只需通过标准的 RESTful actions 管理用户即可。 - janders223
我不确定我表达清楚了:当公司管理员添加用户时,用户会经历“常规”的确认流程(收到确认电子邮件,然后转到页面并使用名称和密码确认帐户)。 我需要使用Devise实现这个功能,对吗? - alex
再次强调,Devise在这里没有任何作用。你的表单需要是<%= form_for [:admin, @user] do |f| %>,有关命名空间表单的更多信息,请参考http://guides.rubyonrails.org/form_helpers.html#relying-on-record-identification。至于验证,同样地,Devise完全不涉及其中,你需要在你的模型上自己处理验证。 - janders223
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接