允许管理员使用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" } 

和我的editors_controller在“app / controllers /”中

  class EditorsController  [: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在我提交表单时在日志中Processing by Devise::RegistrationsController#create as HTML 。 我怀疑也许没有调用skip_before_filter :require_no_authentication ,但是假设因为EditorsControllerinheritance了RegistrationController ,之前filter才能正常工作。 那不是这样吗?

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

您正试图通过skip_before_filter :require_no_authentication解决该问题,但您的表单很可能是POST /editors而不是/admin/editors 。 因此,您需要添加一个允许您在EditorsControllercreateEditorsController

 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' )。

当我尝试使用googleable解决方案时,没有一个可行。 这很有效

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

但这还不够。 因为Devise正在倾听并且会抓住你试图做的任何添加并通过它自己的代码validation它。 所以我只是添加一个带有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| %> 

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

将此操作添加到Users控制器:

 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 

将此类方法添加到User模型:

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

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

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

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

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