标题几乎解释了它。我有一个奇怪的情况,允许用户使用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,特别是我怀疑正在触发Devise结束会话的remember_token,或者可能是在会话被破坏后由Devise完成的。但是我该如何跟踪它呢?
我唯一可以想到的是,导致通知与用户互动,counter_cache
的用户就是notifications_count
。
我感谢有关如何调试的想法和建议!
- 编辑3 -
在使用ruby-debug挖掘后,看起来这个问题与Devise和rails.js脚本的更改有关。参见:
https://github.com/plataformatec/devise/issues/913
https://github.com/ryanb/cancan/issues/280
我正在尝试关于这些线程的一些建议,如果找到解决方案,我会发布。
答案 0 :(得分:12)
我有类似的问题。解决方案就像添加
一样简单 <%= csrf_meta_tag %>
到布局。
答案 1 :(得分:9)
事实证明,这与Rails jQuery UJS驱动程序和Devise的更改有关。我更新了Devise而没有更新jQuery UJS - 并且Devise期望CSRF令牌的处理方式不同,因此它将ajax请求处理为未授权,这意味着破坏了当前用户的会话。升级到最新的jQuery Rails驱动程序解决了这个问题。
答案 2 :(得分:0)
您确定此控制器和操作是由请求触发的控制器和操作吗?这听起来像你正在删除的路径是正确的,而你正在改变你的会话路径。
答案 3 :(得分:0)
销毁通知路径是否可能通过JS重定向到会话销毁路径?
您的通知视图中是否有destroy.js模板?尝试添加一个空的,看看你得到的结果是否不同。