2011-06-22 17 views
11

शीर्षक बहुत अधिक बताता है। मुझे एक अजीब स्थिति है जहां विचार अजाक्स का उपयोग करके अधिसूचनाओं को हटाने की अनुमति देता है जिससे current_user लॉग आउट हो जाता है। मैं यह भी नहीं जानते, जहां इस डिबगिंग शुरू करने के लिए ...अजाक्स लिंक हटाएं 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 वाक्यविन्यास का उपयोग करके भी कोशिश की और इसका असर पड़ा।

मैं डेविस और रेल 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) 

तो, वहाँ यह है, यह उन तालिका के भाग की तरह लग रहा सत्र को समाप्त करने अशक्त करने के लिए सेट कर दिया जाता हो रही है, विशेष रूप से remember_token जो मुझे लगता है वसीयत ट्रिगर कर रहा है या हो सकता है इस के बाद वसीयत द्वारा किया जाता है सत्र नष्ट हो गया है। लेकिन मैं इसे कैसे ट्रैक करूं?

एकमात्र चीज जो मैं सोच सकता हूं जिसके कारण नोटिफिकेशन उपयोगकर्ताओं के साथ बातचीत करने का कारण बनता है counter_cache उपयोगकर्ताओं पर notifications_count के लिए है।

मैं डीबग करने के तरीके पर विचारों और सुझावों की सराहना करता हूं!

- संपादित 3 -

माणिक डिबग के साथ खुदाई के बाद यह मुद्दा तरह तैयार करने से संबंधित है और लग रहा है rails.js स्क्रिप्ट में परिवर्तन। देखें:

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

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

मैं उन धागे पर सुझावों में से कुछ बाहर कोशिश कर रहा हूँ और अगर मैं एक समाधान खोजने के पोस्ट करेंगे।

उत्तर

9

यह पता चला है कि रेलवे jQuery यूजेएस ड्राइवर और डेविस में बदलावों के साथ यह करना पड़ा। मैंने jQuery यूजेएस को अपडेट किए बिना डेविस अपडेट किया था - और डेविस सीएसआरएफ टोकन को अलग-अलग संभालने की उम्मीद कर रहा था, इसलिए यह अजाक्स अनुरोध को अनधिकृत रूप से संसाधित कर रहा था जिसका मतलब वर्तमान उपयोगकर्ता के सत्र को नष्ट करना था। नवीनतम jQuery रेल ड्राइवर में अपग्रेड करने से समस्या ठीक हुई।

+0

आप किस ड्राइवर और संस्करण का उपयोग कर रहे हैं? मुझे वही समस्या है (मुझे पागल गाड़ी चलाएं!), और यह jquery-ujs v। 1.0.12 के साथ तय नहीं है। डेविस 1.3.4 भी चल रहा है धन्यवाद! – Chris

+0

@ क्रिस, 'devise (1.4.0)', और 'jquery-rails (1.0.12) ' – Andrew

+0

एचएम का उपयोग करके, मैंने 1.4.0 तक अपग्रेड किया लेकिन कोई पासा नहीं। डीबग बोर्ड पर वापस .. – Chris

0

क्या आप वाकई इस नियंत्रक और कार्रवाई को अनुरोध द्वारा ट्रिगर कर रहे हैं? ऐसा लगता है कि जिस मार्ग को आप हटा रहे हैं वह सही नहीं है और आप इसके बजाय अपना सत्र पथ मार रहे हैं।

+0

संपादन देखें - मुझे पूरा यकीन है कि लिंक सही है। – Andrew

+0

मैंने अभी गैर-AJAX लिंक का उपयोग करके और नियंत्रक को 'format.html {redirect_to: back} 'पर सेट करने का परीक्षण किया है। यह उम्मीद के अनुसार काम करता है और सत्र को नष्ट नहीं करता है। – Andrew

0

क्या यह संभव है कि नष्ट अधिसूचना पथ जेएस के माध्यम से सत्र को नष्ट करने के लिए रीडायरेक्ट कर रहा है?

क्या आपके पास अपने नोटिफिकेशन दृश्यों में dest.js टेम्पलेट है? खाली होने वाला एक जोड़ने का प्रयास करें देखें कि क्या आपको कोई अलग परिणाम मिलता है।

12

मुझे एक ही समस्या थी। समाधान लेआउट के लिए

<%= csrf_meta_tag %>

जोड़ने के रूप में सरल था।

+2

धन्यवाद अल्फाइन। मेरे मामले में 'csrf_meta_tag' पहले से ही लेआउट में था, लेकिन यह वास्तव में बग से संबंधित है। JQuery यूजेएस के पुराने संस्करण सीएसआरएफ टोकन नहीं भेज रहे थे और सभी एजेक्स अनुरोधों के लिए इसे तैयार करने के नए संस्करणों की आवश्यकता थी। – Andrew

+0

धन्यवाद, मैं इस त्रुटि को रेल 3.2.2 पर हालिया ऐप के साथ अनुभव कर रहा था और नवीनतम रचना, और यह अपराधी था। –

+0

मेरे लिए, यह '<% = csrf_meta_tags%>' था, यानी अंत में एक 's' था। –

संबंधित मुद्दे