我有一个具有注销链接的应用程序:<%= 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中登录的用户帐户每次都没有增加登录次数,而且update_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
答案 0 :(得分:0)
我尝试并创建了用户控制器来检查,似乎一切都很好。我只有一个奇怪的问题,我不确定为什么要更改它。它是关于SQL查询的。您的响应正在获取以下查询。
SELECT `users`.* FROM `users` WHERE `users`.`id` = 4 ORDER BY `users`.`id` ASC LIMIT 1
为什么它有4个ID硬编码,通常应该像下面这样准备语句
SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ? [["id", 4], ["LIMIT", 1]]
因此,为了进行调查,我将尝试使用不同的用户来登录和注销,并检查ID是否在更改。如果没有更改,那么我将调查此ID的来源以及为什么对其进行硬编码。