允许管理员使用Devise添加用户

时间:2013-09-26 01:43:14

标签: ruby-on-rails devise

我正在尝试制作它,所以只有管理员可以使用设计添加用途。我已经得到它主要工作,但是现在当我以管理员身份登录并提交注册表单时,它将我带回错误:You are already signed in.

我已尝试按照此处的说明操作:http://wiki.summercode.com/rails_authentication_with_devise_and_cancan但似乎没有提到这种情况。

我是否需要在editors_controller中进一步覆盖以允许此操作?

以下是我的路线(“编辑”是我的用户模型的名称):

devise_for :admins, :skip => [:registrations]

as :admin do
  get 'admin/editors'        => 'editors#index',                  as: :admin_editors
  get 'admin/editors/new'    => 'editors#new',                    as: :new_editor
  delete 'admin/editors/:id' => 'editors#destroy',                as: :destroy_editor
end


devise_for :editors, :skip => [:registrations],  :controllers => { :registrations => "editors" }

和我在{app / controllers /“

中的editors_controller
    class EditorsController < Devise::RegistrationsController
  before_filter :check_permissions, :only => [:new, :create, :cancel]
  skip_before_filter :require_no_authentication

  def dashboard
    render "editors/dashboard.html.haml"
  end

  def index
    @editors = Editor.all
    respond_to do |format|
      format.html
    end
  end

  private
    def check_permissions
      authorize! :create, resource
    end
end

修改 提交表单时,我在日志中注意到了这个Processing by Devise::RegistrationsController#create as HTML。我怀疑可能没有调用skip_before_filter :require_no_authentication,但是假设EditorsController继承自RegistrationController之前过滤器才能正常工作。那不是这样吗?

3 个答案:

答案 0 :(得分:6)

您需要在create上实施自己的EditorsController方法,而不是从Devise::RegistrationsController继承该操作。正如您所看到的那样,Devise::RegistrationsController中的方法将首先检查您是否已经登录并且如果您已经将其踢回去。如果您尚未登录,则会创建一个User帐户,然后以该用户身份登录。

您正尝试使用skip_before_filter :require_no_authentication解决该问题,但您的表单可能POST代替/editors而不是/admin/editors。因此,您需要添加一条路线,以便您create上的EditorsController

as :admin do
  post 'admin/editors' => 'editors#create'
  # your other :admin routes here
end

然后你想要实现create的缩小版本。你可能想要这样的东西:

class EditorsController < 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

  # your other methods here
end

您还需要确保admin/editors/new模板将表单指向正确的路由('admin/editors')。

答案 1 :(得分:1)

当我尝试使用googleable解决方案时,这些解决方案都无效。这工作

我所做的是在控制器中创建一个新动作,并为它创建一个新路径,并连接我通常连接到创建的视图上的链接,现在调用我的路线和动作。

但这还不够。因为Devise正在倾听并且会抓住你试图做的任何添加并通过它自己的代码验证它。所以我只是用sql插件添加新的用户记录。

添加此路线

post 'savenew', to: 'users#savenew'

将此操作添加到用户控制器:

def savenew
  rawsql = "insert into users (email, created_at,updated_at) values ('#{user_params[:email]}',now(), now())"
  sql = rawsql
  ActiveRecord::Base.connection.execute(sql)
  redirect_to action: 'index''
end

查看:new.html.erb 更改form_for,以便提交将转到新的路由和操作,而不是默认的Rails。

<%= form_for User, :url => {:action => "savenew"} do |f| %>

答案 2 :(得分:0)

在这里使用Rails 4.2.6(我的模型是User而不是Editor)。以下解决方案绕过(我认为)可能会干扰管理员创建新用户的任何设计操作:

将此操作添加到用户控制器:

def savenew
  User.create_new_user(user_params)
  redirect_to action: 'index'
end

如果不存在,请将此私有方法添加到Users控制器:

private

def user_params
  params.require(:user).permit(:email, :password,      
                               :password_confirmation)
end

将此添加到config / routes.rb:

match '/savenew', to: 'users#savenew', via: :post

将此类方法添加到用户模型:

def self.create_new_user(params)
  @user = User.create!(params)
end

我的应用程序中没有单独的Admin类。相反,我为用户定义了一个admin属性,并在UsersController中使用:validate_admin before_action过滤器进行检查。

我希望能够从:index视图创建新用户,因此我添加了一个按钮:

<%= button_to 'New User', '/new_user', class: 'btn btn-primary',
                          method: :get %>

如果您在用户模型中有任何after_create操作(例如发送欢迎电子邮件),则可能需要调整上述解决方案。