允许管理员使用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
,但是假设因为EditorsController
inheritance了RegistrationController
,之前filter才能正常工作。 那不是这样吗?
您需要在EditorsController
上实现自己的create
方法,而不是从Devise::RegistrationsController
inheritance该操作。 正如您所看到的, Devise::RegistrationsController
的方法将首先检查您是否已经登录并且如果您已经将其踢回去。 如果您尚未登录,则会创建一个User
帐户,然后以该用户身份登录。
您正试图通过skip_before_filter :require_no_authentication
解决该问题,但您的表单很可能是POST
/editors
而不是/admin/editors
。 因此,您需要添加一个允许您在EditorsController
上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'
)。
当我尝试使用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_action
filter进行检查。
我希望能够从:index
视图创建一个新用户,所以我添加了一个按钮:
<%= button_to 'New User', '/new_user', class: 'btn btn-primary', method: :get %>
如果您在用户模型中有任何after_create
操作(例如发送欢迎电子邮件),则可能必须调整上述解决方案。