विभिन्न तरीकों का उपयोग करके परीक्षण के कुछ महीनों के बाद अपने स्वयं के प्रश्न का उत्तर दें। मेरा समाधान निम्नलिखित है (रेल के साथ)।
फ़ाइल अपलोड की आवश्यकता वाले किसी भी रूप के लिए मैं data-remote="true"
और enctype="multipart/form-data"
सेट करता हूं और rails.js और jquery.iframe-transport.js शामिल करता हूं।
data-remote="true"
rails.js के साथ सेट करने से मुझे ajax:success
से जुड़ने और सफलता पर Backbone.js मॉडल बनाने की अनुमति मिलती है।
HTML:
<form action="/posts.js" method="post" data-remote="true" enctype="multipart/form-data">
<input type="text" name="post[message]" />
<input type="file" name="post[file]" />
<button>Submit</button>
</form>
जावास्क्रिप्ट:
आप स्पष्ट रूप से ajax:error
त्रुटि मामलों को संभालने के लिए बाध्य करना चाहिए।
मेरे लिए, डेटा ActiveRecord
मॉडल में स्वच्छ है, इसलिए eval
कथन के बारे में बहुत ज्यादा चिंता की जरूरत नहीं है।
$('form').bind('ajax:success', function(event, data) {
new Model(eval(data)); // Your newly created Backbone.js model
});
रेल नियंत्रक:
class PostsController < ApplicationController
respond_to :js
def create
@post = Post.create(params[:post])
respond_with @post
end
end
रेल देखें (create.js।हैमल):
remotipart मणि का उपयोग करना।
यह फॉर्म उस स्थिति को संभालेगा जब फॉर्म enctype
सेट होने पर फ़ाइल अपलोड करता है, और जब ऐसा नहीं होता है।
आप यहां अपनी प्रतिक्रिया पर sanitize
पर कॉल करना चुन सकते हैं।
= remotipart_response do
- if remotipart_submitted?
= "eval(#{Yajl::Encoder.encode(@post)});"
- else
=raw "eval(#{Yajl::Encoder.encode(@post)});"
स्रोत
2012-02-11 22:55:10
साफ। हालांकि दो सवाल। आपके नियंत्रक में, क्या आप 'पोस्ट.न्यू (पैराम्स [: पोस्ट]) करने का इरादा रखते थे या आपने वास्तव में' पोस्ट.क्रेट (पैराम्स [: पोस्ट]) 'का मतलब लिया था? और दूसरा, आप '$ (' फॉर्म ') कहां रखेंगे। बाइंड (' AJAX: सफलता ')' कॉलबैक, बैकबोन में। दिए गए फॉर्म के लिए क्लास क्लास? धन्यवाद! –
ग्रेट कैच, मेरे हिस्से पर टाइपो। यह 'post.create' होना चाहिए। मैं $ ('फॉर्म') रखूंगा। मेरे बैकबोन व्यू में बाइंड ('AJAX: सफलता') जो फॉर्म प्रस्तुत करता है। –
फॉर्म में डेटा-प्रकार = "जेसन" जोड़ें और आप दृश्य को हटा सकते हैं। – maletor