2011-06-22 11 views
11

タイトルでかなり説明されています。私は、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を使用しています。どのようなアイデアが起こっているか、またはデバッグ方法に関する提案?

- EDIT 1 -

routes.rbを

resources :notifications, :only => [:destroy] 

削除]リンク

%span.delete= link_to('dismiss', notification_path(notification), :method => :delete, :remote => true) 

- EDIT 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) 

は、セッションを終了するために、特に私は疑うremember_tokenが工夫をトリガされ、nullに設定なっている、または多分これは後に工夫することによって行われセッションが破棄されました。しかし、私はそれをどのように追跡するのですか?

私が考えることができる唯一のことは、通知とユーザーとのやりとりを引き起こす可能性があることです。ユーザにはnotifications_countcounter_cacheがあります。

デバッグ方法に関するご意見とご感想をお寄せいただきありがとうございます。

- EDIT 3 -

ルビー・デバッグで掘った後、それは問題が工夫する関連しているように見えるrails.jsスクリプトに変更。参照:

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

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

私はそれらのスレッド上での提案のいくつかを試していると私は解決策を見つけた場合掲載します。

答えて

9

これは、Rails jQuery UJSドライバとDeviseの変更に関係していました。私はjQuery UJSを更新せずにDeviseを更新しました.DeviseはCSRFトークンが別々に処理されることを期待していたので、現在のユーザーのセッションを破壊することを意味する無許可のajax要求を処理していました。最新のjQuery Railsドライバにアップグレードすることで問題は解決されました。

+0

あなたはどのドライバとバージョンを使用していますか?私は同じ問題を抱えています(ナッツを動かす!)、それはjquery-ujs v。1.0.12で修正されていません。また、Devise 1.3.4を実行していますありがとう! – Chris

+0

'devise(1.4.0)'と 'jquery-rails(1.0.12)' – Andrew

+0

を使って@Chris、私は1.4.0に変更しましたが、ダイスはアップグレードしませんでした。デバッグボードに戻る.. – Chris

0

このコントローラとアクションは、要求によってトリガーされたものですか? DELETEされていないパスが正しいと思われ、代わりにセッションパスに当たっています。

+0

編集を参照してください - 私はリンクが正しいと確信しています。 – Andrew

+0

私はこれを、非ajaxリンクを使ってテストし、コントローラを 'format.html {redirect_to:back}'に設定しました。これは期待どおりに動作し、セッションを破棄しません。 – Andrew

0

破棄通知パスがJS経由のセッション破棄パスにリダイレクトされている可能性はありますか?

通知ビューにdestroy.jsテンプレートがありますか?空であるものを追加して、別の結果が得られたかどうか確認してください。

12

私は同様の問題がありました。ソリューションは、レイアウトに

<%= csrf_meta_tag %>

を追加するのと同じくらい簡単でした。

+2

ありがとうAlphaOne。私の場合、 'csrf_meta_tag'は既にレイアウトに入っていましたが、これは本当にバグと関連しています。以前のバージョンのjQuery UJSはcsrfトークンを送信しておらず、新しいバージョンのdeviseではすべてのAjaxリクエストに必要でした。 – Andrew

+0

ありがとう、私はRails 3.2.2の最新のアプリケーションと最新のツールでこのエラーが発生していましたが、これが原因です。 –

+0

私にとっては、 '<%= csrf_meta_tags%>'、つまり最後には 's'でした。 –

関連する問題