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模板?尝试添加一个空的,看看是否得到不同的结果。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...