我正在尝试制作它,所以只有管理员可以使用设计添加用途。我已经得到它主要工作,但是现在当我以管理员身份登录并提交注册表单时,它将我带回错误: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
之前过滤器才能正常工作。那不是这样吗?
答案 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
操作(例如发送欢迎电子邮件),则可能需要调整上述解决方案。