【发布时间】:2019-03-06 02:16:15
【问题描述】:
我有一个带有注销链接的应用程序:<%= link_to('Logout', destroy_user_session_path, method: :delete) %>
单击该链接后,我的开发服务器日志中会显示以下内容:
Started DELETE "/users/sign_out" for 172.30.0.1 at 2019-03-06 14:52:49 +1300
Processing by Users::SessionsController#destroy as HTML
Parameters: {"authenticity_token"=>"JLLEb2GSjGuYx+oBhsAkB0jcP0qZCJEUBvuH5VDmCS9Xbwe/hw085gumBPqJmWTtjyFeW1Io81n32NGxDuKjyQ=="}
User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 4 ORDER BY `users`.`id` ASC LIMIT 1
(0.2ms) BEGIN
(0.4ms) COMMIT
Redirected to https://webdev.test:3000/
Completed 302 Found in 28ms (ActiveRecord: 0.9ms)
然后根页面再次加载,但用户尚未退出。
我在 Chrome 中以隐身模式打开了一个选项卡,并尝试登录和注销,它工作正常,所以它似乎是我的正常模式浏览器特有的东西。我已经尝试重新启动浏览器,但没有任何影响。
我在 Devise 中登录的用户帐户在每次执行此操作时都不会增加其登录计数,updated_at 时间戳也不会改变。
然后我将byebug 放入我的根页面控制器方法中并运行以下命令:
1: class HomeController < ApplicationController
2: def index
3: byebug
=> 4: # Omitted for brevity, nothing which touches the current_user object
5: end
6: end
(byebug) Devise.sign_out_all_scopes
true
(byebug) sign_out
(0.8ms) BEGIN
(0.4ms) COMMIT
true
(byebug) continue
然后确认,用户仍然没有退出。
重新启动 Rails 应用程序并再次尝试上述所有操作都会导致相同的结果,但我仍然无法退出该用户。
以前有没有人看过这个并且对卡住的问题以及如何退出有任何想法?
编辑
应评论者的要求,与sign_out相关的路线:
$ rails routes | grep sign_out
destroy_user_session DELETE /users/sign_out(.:format) users/sessions#destroy
$
rails routes | grep destroy_user_session 的输出也与上述相同,因此它表明没有将请求定向到不同控制器操作的命名路由。
还有app/controllers/users/sessions_controller.rb的控制器(它只覆盖create方法,而不是destroy方法)
class Users::SessionsController < Devise::SessionsController
def create
# Omitted for brevity
end
end
【问题讨论】:
-
您可以运行命令
rails routes打印出写入并仅显示与用户注销相关的路由吗?我认为您正在使用另一个控制器请分享您覆盖它的控制器的销毁方法。正如我想检查的那样,它显示的是 Users::SessionsController#destroy 而不是 Devise::SessionControl#destroy -
我没有覆盖 SessionsController 的 destroy 方法,只有 create 方法。将很快添加路线。
标签: ruby-on-rails devise