2011-02-26 10 views
60

पर सत्र पुनः लोड नहीं कर रहा है मुझे jQuery का उपयोग करके रेल और अजाक्स के साथ एक बहुत ही अजीब समस्या का सामना करना पड़ रहा है (हालांकि मुझे नहीं लगता कि यह jQuery के लिए विशिष्ट है)।रेल अजेक्स पोस्ट

मेरा रेल एप्लिकेशन कुकी सत्र स्टोर का उपयोग करता है, और मेरे पास एक बहुत ही सरल लॉगिन है जो सत्र में उपयोगकर्ता आईडी सेट करता है। यदि user_id सत्र में सेट नहीं है, तो यह लॉगिन पृष्ठ पर रीडायरेक्ट करता है। यह कोई समस्या नहीं के साथ काम करता है। JQuery GET अनुरोध भी ठीक काम करते हैं। समस्या तब होती है जब मैं एक jQuery पोस्ट करता हूं - ब्राउज़र सत्र कुकी को ठीक भेजता है (मैंने फ़ायरबग के साथ इसकी पुष्टि की और लॉग को request.cookies डंप किया) लेकिन सत्र खाली है, यानी सत्र {} है।

मैं अपने application.js में यह कर रहा हूँ:

$.post('/test/1', { _method: 'delete' }, null, 'json'); 

जो इस नियंत्रक विधि करने के लिए मिलना चाहिए (_method: हटाना):

$(document).ajaxSend(function(e, xhr, options) { 
    var token = $("meta[name='csrf-token']").attr('content'); 
    xhr.setRequestHeader('X-CSRF-Token', token); 
}); 

और यहाँ मेरे नमूना पोस्ट है

def destroy 
    respond_to do |format| 
    format.json { render :json => { :destroyed => 'ok' }.to_json } 
    end 
end 

लॉग को देखकर और फायरबग का उपयोग करके मैं पुष्टि कर सकता हूं कि सही कुकी मूल्य अनुरोध में भेजा गया है जब एजेक्स पोस्ट होता है तो ader, लेकिन ऐसा लगता है कि कुछ बिंदुओं पर रेल इस मान को खो देता है और इसलिए सत्र खो देता है, इसलिए यह लॉगिन पेज पर रीडायरेक्ट करता है और कभी भी विधि पर नहीं जाता है।

मैंने यह सब कुछ करने की कोशिश की है जिसे मैं डीबग करने के बारे में सोच सकता हूं लेकिन मैं इस विचार के आसपास आ रहा हूं कि यह रेल में एक बग हो सकता है। मैं रेल 3.0.4 और jQuery 1.5 का उपयोग कर रहा हूं अगर यह मदद करता है। मुझे यह बहुत अजीब लगता है कि नियमित (यानी गैर-अजाक्स) अनुरोधों को प्राप्त करते हैं और पोस्ट करते हैं, और AJAX को कोई समस्या नहीं होने पर अनुरोध मिलते हैं, यह केवल अजाक्स पोस्ट नहीं है जो नहीं करते हैं।

इसे ठीक करने की कोशिश करने में कोई भी मदद की सराहना की जाएगी!

बहुत धन्यवाद,
डेव

उत्तर

112

मैं अपने ही सवाल का जवाब देने के रूप में मैं बाहर काम करने के क्या हो रहा था प्रबंधित किया है जा रहा हूँ। अगर यह किसी और के लिए उपयोगी है तो मैं इसे यहां पोस्ट करूंगा!

आगे की जांच के बाद, मैंने यह काम किया कि कोड को CSRF टोकन के साथ अनुरोध शीर्षलेख सेट करने के लिए नहीं था।

$(document).ajaxSend(function(e, xhr, options) { 
    var token = $("meta[name='csrf-token']").attr('content'); 
    xhr.setRequestHeader('X-CSRF-Token', token); 
}); 

क्या हो रहा था कि इस कोड हैडर की स्थापना नहीं की गई थी, रेल एक अजाक्स अनुरोध प्राप्त किया गया था, टोकन से मेल नहीं खाती है और यह सत्र को रीसेट किया गया था: यह मूल कोड था। यह एक एक्शन कंट्रोलर :: अमान्य प्रमाणीकरण टोकन त्रुटि को बढ़ाने के लिए उपयोग किया जाता है (मुझे लगता है कि अगर कोई त्रुटि उठाई गई थी तो मैं इसे पहले पकड़ा होता था ... ओह ठीक है), लेकिन रेल 3.0.4 के बाद से यह चुपचाप सत्र को रीसेट करता है।

तो शीर्षक में टोकन भेजने के लिए, आप (this marvellous blog post को बहुत धन्यवाद) यह करने के लिए है:

$.ajaxSetup({ 
    beforeSend: function(xhr) { 
    xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')); 
    } 
}); 

और अब यह सब एकदम सही ढंग से काम करता है। जो अच्छा है।

0

यही है कि official jquery-ujs rails adapter 3.0 श्रृंखला में है। रेल संस्करणों को अपग्रेड करते समय आपको इसे अद्यतन रखना याद रखना होगा।

मेरे लिए, 3.0.3 से 3.0.8 तक अपग्रेड करना।आरसी 4 का मतलब है लिंक किए गए रेपो से src/rails.js फ़ाइल मैन्युअल रूप से ला रहा है।

रेल 3.1 के बाद से अंत में jQuery के लिए स्विच बनाया है, बातें jQuery-रेल मणि के माध्यम से भविष्य में स्वत: अद्यतन करना चाहिए जब रेल अद्यतन करने (और 3.1 के अंतर्निहित परिसंपत्ति पाइपलाइन का प्रयोग करके)

5

मैं एक और पाया मामला:

क्या आपने अपनी एप्लिकेशन लेआउट फ़ाइल में 'csrf_meta_tag' सेट किया है?

मेरे मामले में, मैंने उस टैग को सेट नहीं किया है, और आपके साथ एक ही समस्या से मुलाकात की है।

और ऐप/विचार/लेआउट/application.html.erb में csrf_meta_tag सेट करने के बाद, सब ठीक काम करता है!

अंत में, मुझे रूट कारण खोजने में मदद के लिए धन्यवाद! बहुत बहुत धन्यवाद ~

+0

यह टैग 'csrf_meta_tags' से अधिक हो गया है – ChrisW

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