2013-02-13 14 views
9

मुझे सर्वर पर वापस जावास्क्रिप्ट के माध्यम से पैरा पास करने की आवश्यकता है। फिलहाल, मैं बहुत तरह जावास्क्रिप्ट में उन्हें पारित:रेल: अजाक्स के माध्यम से पास पैरा

sendParams("<%= params[:q].to_json %>"); 

और फिर उन्हें वापस भेजने के इस तरह:

function sendParams(q){ 
    $.ajax({ 
    url: '/mymodel/myaction', 
    type: 'post', 
    data: {'q':q}, 
    contentType: 'json' 
    }); 
} 

मेरी नियंत्रक में, मैं उन्हें मैं किसी भी अन्य पैरामीटर की तरह इस्तेमाल करने की कोशिश:

MyModel.where(params[:q]) 

लेकिन पैरामीटर, वापस खाली आ रहे हैं, भले ही फ़ायरबग पोस्ट टैब में यह पता चलता है:

q=%7B%26quot%3Bc%26quot%3B%3A%7B%26quot%3B0%26quot%3B%3A%7B%26quot%3Ba%26quot%3B%3A%7B%26quot%3B0%26quot%3B%3A%7B%26quot%3Bname%26quot%3B%3A%26quot%3Btitle%26quot%3B%7D%7D%2C%26quot%3Bp%26quot%3B%3A%26quot%3Bcont%26quot%3B%2C%26quot%3Bv%26quot%3B%3A%7B%26quot%3B0%26quot%3B%3A%7B%26quot%3Bvalue%26quot%3B%3A%26quot%3B2%26quot%3B%7D%7D%7D%7D%2C%26quot%3Bs%26quot%3B%3A%7B%26quot%3B0%26quot%3B%3A%7B%26quot%3Bname%26quot%3B%3A%26quot%3Bvotes_popularity%26quot%3B%2C%26quot%3Bdir%26quot%3B%3A%26quot%3Bdesc%26quot%3B%7D%7D%7D 

कोई विचार क्यों इस जानकारी को क्लॉज द्वारा संसाधित नहीं किया जा रहा है? पैरा को फिर से पठनीय बनाने के लिए मैं क्या कर सकता हूं?

अद्यतन:

Started POST "/publications/search?scroll=active&page=6" for 127.0.0.1 at 2013-0 
2-12 22:55:24 -0600 
Processing by PublicationsController#index as */* 
Parameters: {"scroll"=>"active", "page"=>"6"} 

अद्यतन 2:

समस्या जाहिरा तौर पर contentType से उत्पन्न कर रहा है। जब मैं इसे हटा देता हूं, तो q को रेल पैरामीटर के रूप में भेजा जाता है।

undefined method `with_indifferent_access' for #<String:0x686d0a8> 

कैसे मैं एक पैरामीटर हैश को JSON परिवर्तित कर सकते हैं: दुर्भाग्य से, q अभी भी JSON में, त्रुटि में परिणाम है?

+0

क्या आप विकास.लॉग में लॉग इन अनुरोध और पैराम प्रदर्शित कर सकते हैं। मुझे लगता है कि यह एक देव env है। – manoj

+0

अच्छा पकड़ो। पैरामीटर में "क्यू" दिखाई नहीं दे रहा है। मुझे लगता है कि यह पोस्ट डेटा में है, भले ही यह चाहिए? – nullnullnull

उत्तर

5

होना चाहिए वहाँ मुद्दों इस के लिए हल किया जा करने के लिए आवश्यक है कि काम करने के लिए के एक जोड़े थे

data: {'q':q}, 

है। सबसे पहले, q को रेल के पैरामीटर के रूप में नहीं भेजा जा रहा था, भले ही वह पोस्ट कर रहा था। इसका कारण यह था क्योंकि इसे पैरामीटर के बजाए JSON डेटा के रूप में माना जा रहा था। मैं लाइन निकाल कर इस तय:

contentType: 'json' 

उसके बाद, AJAX ठीक से भेजा 'क्यू', लेकिन रेल इसे प्रयोग के रूप में यह JSON में था हमें समस्या हुई। मुझे ActiveSupport::JSON.decode के साथ इसे पार्स करना पड़ा, लेकिन यह 737: unexpected token त्रुटि फेंक रहा था। मैंने कोड (JSONlint) [http://jsonlint.com/] के माध्यम से कोड चलाया, और यह पता चला कि सभी उद्धरण चिह्न बच गए थे।

वहां से, दो समाधान थे। स्पष्ट एक तो जैसे .html_safe उपयोग करने के लिए किया गया था:

sendParams("<%= params[:q].to_json.html_safe %>"); 

लेकिन उपयोगकर्ता inputed जब उद्धरण इस समस्याओं के कारण।

ActiveSupport::JSON.decode(CGI.unescapeHTML(params[:q])) 

और यह चाल किया: सुरक्षित विकल्प के बाद वे इतनी तरह रेल को वापस पारित किए गए भाग निकले HTML निकाय डिकोड करने के लिए किया गया था।

6

आपका डेटा पैरामीटर गलत है।

आप यह

data: {q: 'q'}, 
+1

अच्छा बिंदु। मुझे उद्धरणों में पहला 'क्यू' नहीं डालना चाहिए, हालांकि मेरे मामले में, मुझे लगता है कि मुझे दूसरे क्यू को छोड़ दिया जाना चाहिए। (यह एक तर्क है कि मैंने फ़ंक्शन में पारित किया है।) दुर्भाग्यवश, उद्धृत और निर्विवाद दूसरे क्यू दोनों को आजमाएं, काम नहीं करता है। मेरे लॉग के अनुसार, कुछ कारणों से q पैरामीटर पारित नहीं हो रहा है। – nullnullnull

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