【问题标题】:Ajax Delete links log out current_userAjax 删除链接注销 current_user
【发布时间】:2011-06-22 02:36:00
【问题描述】:

标题几乎解释了它。我遇到一种奇怪的情况,允许用户使用 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)

所以,就是这样,看起来用户表的一部分被设置为 null,尤其是我怀疑触发 Devise 以结束会话的 remember_token,或者这可能是在会话被销毁后由 Devise 完成的。但是我该如何追踪呢?

我能想到的唯一导致通知与用户交互的事情是用户上有一个counter_cachenotifications_count

感谢有关如何调试的想法和建议!

-- 编辑 3--

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

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

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

我正在尝试有关这些主题的一些建议,如果找到解决方案,我会发布。

【问题讨论】:

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


    【解决方案1】:

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

    &lt;%= csrf_meta_tag %&gt;

    到布局。

    【讨论】:

    • 感谢 AlphaOne。在我的情况下,csrf_meta_tag 已经在布局中,但这确实与该错误有关。旧版本的 jQuery UJS 没有发送 csrf 令牌,而新版本的 devise 需要它来处理所有 ajax 请求。
    • 谢谢,我在使用 Rails 3.2.2 和最新设计的最新应用时遇到了这个错误,这是罪魁祸首。
    • 对我来说,它是&lt;%= csrf_meta_tags %&gt;,即末尾的s
    【解决方案2】:

    事实证明,这与 Rails jQuery UJS 驱动程序和设计的更改有关。我在没有更新 jQuery UJS 的情况下更新了 Devise——并且 Devise 期望 CSRF 令牌以不同的方式处理,因此它将 ajax 请求处理为未经授权,这意味着破坏当前用户的会话。升级到最新的 jQuery Rails 驱动程序解决了这个问题。

    【讨论】:

    • 您使用的是哪个驱动程序和版本?我有同样的问题(让我发疯!),并且 jquery-ujs v. 1.0.12 没有解决这个问题。同时运行 Devise 1.3.4 谢谢!
    • @Chris,使用 devise (1.4.0)jquery-rails (1.0.12)
    • @Chris:我发现使用调试器很有帮助,它让我意识到 Devise 正在处理未经授权的请求。检查导轨 (guides.rubyonrails.org/debugging_rails_applications.html)。您正在寻找的关键是您的 Ajax 请求需要发送 CSRF 令牌,否则 Devise 会将您注销。
    • 非常感谢安德鲁。我想到了。我的问题是我忘记在我的布局头中包含对 csrf_meta_tag 助手的调用。啊!现在它适用于设计 1.3.4 和 jquery-rails 1.0.12。
    【解决方案3】:

    您确定这个控制器和动作是由请求触发的吗?听起来您正在删除的路径不正确,而是您正在访问会话路径。

    【讨论】:

    • 我刚刚使用非 ajax 链接对此进行了测试,并将控制器设置为 format.html { redirect_to :back }。这按预期工作,不会破坏会话。
    【解决方案4】:

    有没有可能是destroy通知路径是通过js重定向到session的destroy路径?

    您的通知视图中有destroy.js 模板吗?尝试添加一个空的,看看你是否得到不同的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-19
      • 2012-10-01
      • 2015-02-06
      • 1970-01-01
      • 2015-07-05
      • 2012-06-01
      • 2015-01-14
      • 1970-01-01
      相关资源
      最近更新 更多