ruby-on-rails - Ajax 删除链接 注销current_user

标签 ruby-on-rails ajax ruby-on-rails-3 devise

标题已经解释了这一点。我遇到了一种奇怪的情况,允许用户使用 Ajax 删除通知的 View 会导致 current_user 被注销。我什至不知道从哪里开始调试这个......

这是 Controller

class NotificationsController < ApplicationController

    def destroy
        @notification = Notification.find(params[:id])
        @notification.destroy
        respond_to do |format|
            format.js
        end
    end


end

这是整个 Controller ,没有任何删减。通知是由系统生成的,因此用户可以采取的唯一操作就是“关闭”(即删除)它们。

我还使用较新的 respond_with 语法尝试过此操作,并取得了相同的效果。

我正在使用 Devise 和 Rails 3.0.9。知道会发生什么吗——或者关于如何调试的建议?

-- 编辑 1--

路线.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)

所以,看起来用户表的一部分被设置为空,特别是我怀疑正在触发 Devise 结束 session 的 Remember_token,或者这可能是在 session 被销毁后由 Devise 完成的。但我如何追踪它呢?

我能想到的导致通知与用户交互的唯一原因是用户上有一个用于 notifications_countcounter_cache

我很欣赏有关如何调试的想法和建议!

-- 编辑 3--

使用 ruby​​-debug 进行挖掘后,看起来问题与 Devise 和对rails.js 脚本的更改有关。请参阅:

https://github.com/plataformatec/devise/issues/913

https://github.com/ryanb/cancan/issues/280

我正在尝试这些线程中的一些建议,如果找到解决方案,我会发布。

最佳答案

我也遇到了类似的问题。解决方案就像添加一样简单

<%= csrf_meta_tag %>

到布局。

关于ruby-on-rails - Ajax 删除链接 注销current_user,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6434283/

相关文章:

ruby-on-rails - 双向自引用关联

javascript - bootstrap - bootstrap 仅在调整大小后工作

javascript - 如何在不刷新页面或更改 url 的情况下加载不同的 html 页面?

ruby-on-rails - ActionView::MissingTemplate:缺少模板

ruby-on-rails - 设计 prepend_before_filter :require_no_authentication not working

ruby-on-rails - Rails Dysfunctional,需要 Rack 1.3.5,有 1.4.0 但无法安装 1.3.5

ajax - 保护 AJAX 应用程序+请求的最佳方式

ruby-on-rails-3 - 从Rails控制台重新加载助手

ruby-on-rails - Ruby/Rails : Respond to json request, 从对象数组创建哈希数组,更改键的名称

html - Logo 未显示在每个页面上