Trả lời câu hỏi của riêng tôi sau vài tháng dùng thử bằng các phương pháp khác nhau. Giải pháp của tôi là sau (với Rails).
Đối với bất kỳ biểu mẫu nào yêu cầu tải lên tệp, tôi sẽ đặt data-remote="true"
và enctype="multipart/form-data"
và bao gồm rails.js và jquery.iframe-transport.js.
Đặt data-remote="true"
với rails.js cho phép tôi liên kết với ajax:success
và tạo mô hình Backbone.js thành công.
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>
JavaScript:
Bạn rõ ràng nên ràng buộc ajax:error
để xử lý các trường hợp lỗi.
Đối với tôi, dữ liệu được vệ sinh trong mô hình ActiveRecord
, vì vậy đừng lo lắng quá nhiều về tuyên bố eval
.
$('form').bind('ajax:success', function(event, data) {
new Model(eval(data)); // Your newly created Backbone.js model
});
Rails Bộ điều khiển:
class PostsController < ApplicationController
respond_to :js
def create
@post = Post.create(params[:post])
respond_with @post
end
end
Rails View (create.js.haml):
Sử dụng đá quý remotipart.
Thao tác này sẽ xử lý trường hợp tệp tải lên với biểu mẫu enctype
và khi nào tệp đó không được đặt.
Bạn có thể chọn gọi sanitize
về câu trả lời của mình tại đây.
= remotipart_response do
- if remotipart_submitted?
= "eval(#{Yajl::Encoder.encode(@post)});"
- else
=raw "eval(#{Yajl::Encoder.encode(@post)});"
Nguồn
2012-02-11 22:55:10
Gọn gàng. Hai câu hỏi mặc dù. Trong bộ điều khiển của bạn, bạn có định làm 'Post.new (params [: post])' hay bạn thực sự có nghĩa là 'Post.create (params [: post])'? Và thứ hai, nơi bạn sẽ đặt '$ ('form'). Bind ('ajax: success')' gọi lại, trong một lớp Backbone.View cho biểu mẫu đã cho? Cảm ơn! –
Bắt tuyệt vời, đánh máy về phía tôi. Nó phải là 'Post.create'. Tôi sẽ đặt $ ('form'). Bind ('ajax: success') trong khung nhìn Backbone của tôi để render form. –
Thêm kiểu dữ liệu = "json" vào biểu mẫu và bạn có thể xóa chế độ xem. – maletor