Ajax Удалить ссылки выйти из current_user - PullRequest
11 голосов
/ 22 июня 2011

Название в значительной степени объясняет это.У меня странная ситуация, когда представления, позволяющие пользователям удалять уведомления с помощью 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)

Итак, тампохоже, что часть пользовательской таблицы установлена ​​на ноль, особенно запоминаемый токен, который, как я подозреваю, запускает Devise для завершения сеанса, или, возможно, это делается 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

Я пробую некоторые предложения по этим темам и опубликую, если найду решение.

Ответы [ 4 ]

12 голосов
/ 22 июля 2011

У меня была похожая проблема. Решение было так же просто, как добавление

<%= csrf_meta_tag %>

к макету.

9 голосов
/ 28 июня 2011

Оказывается, это связано с изменениями в драйвере Rails jQuery UJS и Devise. Я обновил Devise без обновления jQuery UJS - и Devise ожидал, что токен CSRF будет обрабатываться по-другому, поэтому он обрабатывал запрос ajax как несанкционированный, что означало уничтожение сеанса текущего пользователя. Обновление до последней версии драйвера jQuery Rails устранило проблему.

0 голосов
/ 22 июня 2011

Возможно ли, что путь уведомления об удалении перенаправляет на путь уничтожения сеанса через JS?

Есть ли у вас шаблон destroy.js в ваших представлениях уведомлений?попробуйте добавить один пустой, посмотрите, если вы получите другой результат.

0 голосов
/ 22 июня 2011

Вы уверены, что этот контроллер и действие запускаются по запросу? Похоже, что путь, которым вы УДАЛЯЕТЕ, не верен, и вместо этого вы выбираете путь сеанса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...