使用Devise和自定义路由,只要用户尝试登录无效(错误传递),Rails就不会重定向回登录页面。如果我不使用自定义路由,那么它工作正常。我在这里做错了什么?
目标:我想使用/ signin而不是/ users / sign_in
routes.rb中:
devise_for :users, :controllers => { :sessions => "user_sessions" },:skip => [:sessions] do
get 'signin' => 'user_sessions#new', :as => :new_user_session
post 'signin' => 'user_sessions#create', :as => :user_session
delete 'signout' => 'user_sessions#destroy', :as => :destroy_user_session
get 'signout' => 'user_sessions#destroy', :as => :destroy_user_session
end
在UserSessionsController / create:
中resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#new")
使用自定义路由/登录时的服务器输出:
Completed 401 Unauthorized in 2ms
使用默认路由/ user / sign_in时的服务器输出:
Completed 401 Unauthorized in 2ms
Processing by UserSessionsController#new as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"2gqKTGWPv69HpVp7oSEg2tRDj5FU453my7LhKm0xu7E=", "user"=>{"email"=>"", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"SIGN IN"}
Rendered user_sessions/new.html.erb within layouts/user_sessions (56.6ms)
答案 0 :(得分:1)
更换:
<%= form_for(resource, :as => resource_name, :url => admin_session_path(resource_name)) do |f| %>
使用:
<%= form_for(resource, :as => resource_name, :url => admin_session_path) do |f| %>
在session / new.html.erb文件中为我工作。
答案 1 :(得分:0)
我知道这个问题已经在几个月前发布了但是我热了同样的问题,经过几个小时的斗争,覆盖Devise SessionController,设计自定义失败,调试通过等等,我终于找到了什么正在进行中,我决定分享解决方案,这样你们就不必经历那个了。 错误“在XXms中完成401未授权”发生在lign:resource = build_resource(...)的SessionController的create方法中。并且由于资源未传递到服务器,因此无法构建资源。现在问题在于为什么资源没有传递给服务器?我正在使用JQUERY mobile将sign_in发布为AJAX调用,JQUERY无法通过AJAX上传这样的数据。 Yuu需要在你的登录表单中添加data-ajax = false: 在Devise / sessions / new.html.erb中修改表单如下所示:
form_for(resource, :as => resource_name, :url => user_session_url, html: {data: {ajax: false}}) do |f|
希望能帮助有人在路上。