2012-03-07 21 views
5

मेरे वर्तमान रेल ऐप में मैं ajax uploader लाइब्रेरी का उपयोग कर रहा हूं जिसके लिए आपको जेसन {success:true} के साथ प्रतिक्रिया देने की आवश्यकता है ताकि फ़ाइल सफलतापूर्वक अपलोड की जा सके।रेल जेएस प्रतिक्रिया, दोनों स्थिति और टेम्पलेट प्रस्तुत करते हैं?

मेरे ऐप में फ़ाइलें छवियां हैं, और अपलोड के बाद मैं इसे पृष्ठ में जोड़ना चाहता हूं। आम तौर पर मैं कुछ ऐसा करना होगा: create.js.erb रूप

respond_to do |format| 
    format.html { redirect_to @resource, :notice => 'Created.' } 
    format.js 
end 

ऊपर के उदाहरण में मेरी जे एस उत्तर उचित टेम्पलेट प्रस्तुत करना होता है, इस तरह के जो की तरह कुछ कह सकते हैं ...

$('#resources').append('<%= escape_javascript(render '@resource') %>'); 

यह मैं कैसे है अतीत में अजाक्स टिप्पणियों आदि जैसी चीजें। अब, मेरी respond_to ब्लॉक काम कर अपलोड करने वाले पाने के लिए वर्तमान में इस करता है:

format.js { render :json => { :success => true } } 

इस अपलोडर काम करता है, लेकिन मेरे जैसे मैं सामान्य रूप से एक अजाक्स प्रतिक्रिया के साथ होता पेज को प्रदान की गई partials जोड़ने रोकता रहा है।

मेरा सवाल है, क्या दोनों को पूरा करने का कोई तरीका है? यदि नहीं, तो आप सफलतापूर्वक बनाए जाने के बाद प्रस्तुत वस्तुओं के साथ पृष्ठ को कैसे पॉप्युलेट करेंगे?

उत्तर

3

आप सीधे नियंत्रक से या दृश्य टेम्पलेट का उपयोग करके दोनों नहीं कर सकते हैं। ऐसा लगता है कि AJAX अपलोडर एक प्रतिक्रिया की उम्मीद कर रहा है जिसे JSON के रूप में पार्स किया जा सकता है, इसलिए टेम्पलेट का उपयोग करके कोई अन्य प्रतिक्रिया जोड़ना (जिसका मतलब format.js { render :json => { :success => true }} नहीं कर रहा है) जेएसओएन को प्रतिक्रिया निकाय के रूप में वापस नहीं भेजेगा।

प्लगइन के लिए source पर देखकर, आप देख सकते हैं कि आप onComplete चलाने के लिए एक विधि को परिभाषित कर सकते हैं जो आपको JSON प्रतिक्रिया देगा।

यह अनचाहे है, लेकिन आपको बंद करना चाहिए। तो तुम अगर की तरह

format.js do 
    partial = render_to_string @resource 
    render :json => { :success => true, :partial => partial } 
end 
फिर अपने जावास्क्रिप्ट में पृष्ठ पर

अपने JSON उत्तर का विस्तार जब आप सेटअप अपने ajax अपलोड करने वाले, कॉलबैक

var uploader = new qq.FileUploader({ 
    element: document.getElementById('file-uploader'), 
    action: '/upload', 
    onComplete: function(id, fileName, responseJSON) { 
    $('#resources').append(responseJSON.partial); 
    } 
}); 
+0

यह विचार काम करता है जोड़ें। मुझे 'render_to_string' के बारे में पता नहीं था, लेकिन परीक्षण में मैंने पाया कि मैं आंशिक रूप से पुनर्प्राप्त करने के लिए कॉलबैक में' .getScript' का भी उपयोग कर सकता हूं। आपकी विधि क्लीनर है। धन्यवाद! – Andrew

+0

एक नोट ... डिफ़ॉल्ट रूप से 'escape_javascript' नियंत्रक के लिए उपलब्ध नहीं है, और इसकी आवश्यकता नहीं है क्योंकि' रेंडर: जेसन' विधि वैसे भी करता है। – Andrew

+0

शांत, खुशी है कि यह मदद करता है। यह समझ में आता है कि 'escape_javascript' वहां काम नहीं करता है, मुझे नहीं पता कि मैं क्या सोच रहा था। उत्तर पर प्रतिक्रिया के लिए धन्यवाद – danivovich

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