如何解决Ajax删除链接注销current_user
| 标题几乎可以解释这一点。我遇到一种奇怪的情况,即允许用户使用Ajax删除通知的视图导致current_user注销。我什至不知道从哪里开始调试... 这是控制器class NotificationsController < ApplicationController
def destroy
@notification = Notification.find(params[:id])
@notification.destroy
respond_to do |format|
format.js
end
end
end
这是整个控制器,没有任何内容要删节。通知是由系统生成的,因此用户可以采取的唯一措施是“取消”(即删除)它们。
我还使用较新的respond_with
语法进行了尝试,并且具有相同的效果。
我正在使用Devise和Rails 3.0.9。任何想法可能会发生什么-或有关调试的建议?
-编辑1-
Routes.rb
resources :notifications,:only => [:destroy]
删除连结
%span.delete= link_to( \'dismiss\',notification_path(notification),:method => :delete,:remote => true )
-编辑2-
好吧,我注意到日志中有新内容-参见下面的****。
Started DELETE \"/notifications/10\" for 127.0.0.1 at 2011-06-21 21:47:15 -0500
Processing by NotificationsController#destroy as JS
Parameters: {\"id\"=>\"10\"}
SQL (0.4ms) SELECT name
FROM sqlite_master
WHERE type = \'table\' AND NOT name = \'sqlite_sequence\'
SQL (0.3ms) SELECT name
FROM sqlite_master
WHERE type = \'table\' AND NOT name = \'sqlite_sequence\'
User Load (0.7ms) SELECT \"users\".* FROM \"users\" WHERE \"users\".\"id\" = 1 LIMIT 1
Slug Load (0.4ms) SELECT \"slugs\".* FROM \"slugs\" WHERE (\"slugs\".sluggable_id = 1 AND \"slugs\".sluggable_type = \'User\') ORDER BY id DESC LIMIT 1
****AREL (0.3ms) UPDATE \"users\" SET \"remember_token\" = NULL,\"remember_created_at\" = NULL,\"updated_at\" = \'2011-06-22 02:47:15.913839\',\"preferences\" = \'---
:email_notifications: \'\'true\'\'
\' WHERE \"users\".\"id\" = 1
Notification Load (0.2ms) SELECT \"notifications\".* FROM \"notifications\" WHERE \"notifications\".\"id\" = 10 LIMIT 1
User Load (1.0ms) SELECT \"users\".* FROM \"users\" WHERE \"users\".\"id\" = 1 LIMIT 1
AREL (0.3ms) UPDATE \"users\" SET \"notifications_count\" = COALESCE(\"notifications_count\",0) - 1 WHERE \"users\".\"id\" = 1
AREL (0.1ms) DELETE FROM \"notifications\" WHERE \"notifications\".\"id\" = 10
Rendered notifications/destroy.js.erb (0.7ms)
Completed 200 OK in 6416ms (Views: 9.6ms | ActiveRecord: 4.1ms)
如此看来,users表的一部分似乎已设置为null,尤其是我怀疑的记得牢记(token_token)触发了Devise结束会话,或者这可能是在会话被销毁后由Devise完成的。但是我该如何追踪呢?
我能想到的导致通知与用户互动的唯一一件事是用户上有ѭ5,for6。
我感谢有关调试的想法和建议!
-编辑3-
在使用ruby-debug进行挖掘之后,问题似乎与Devise和对rails.js脚本的更改有关。看到:
https://github.com/plataformatec/devise/issues/913
https://github.com/ryanb/cancan/issues/280
我正在尝试有关这些线程的一些建议,如果找到解决方案,将发布这些建议。
解决方法
我有一个类似的问题。解决方案就像添加一样简单
<%= csrf_meta_tag %>
到布局。
, 事实证明,这与Rails jQuery UJS驱动程序和Devise的更改有关。我已经更新了Devise,而没有更新jQuery UJS,并且Devise期望CSRF令牌的处理方式有所不同,因此它将ajax请求视为未授权,这意味着破坏了当前用户的会话。升级到最新的jQuery Rails驱动程序可以解决此问题。
, 您确定此控制器和操作是由请求触发的吗?听起来您正在DELETEing的路径不正确,而您正在单击会话路径。
, 销毁通知路径是否有可能通过JS重定向到会话销毁路径?
通知视图中是否有destroy.js模板?尝试添加一个空的,看看是否得到不同的结果。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。