Odpowiadając na moje własne pytanie po kilku miesiącach prób, używając różnych metod. Moje rozwiązanie jest następujące (z Railsami).
Dla jakiejkolwiek formie, która wymaga przesyłania plików Chciałbym ustawić data-remote="true"
i enctype="multipart/form-data"
i obejmują rails.js i jquery.iframe-transport.js.
Ustawienie z rails.js pozwala mi powiązać z ajax:success
i utworzyć model Backbone.js na sukces.
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:
Należy oczywiście wiązać ajax:error
obsługiwać przypadki błędów.
Dla mnie dane są odkażane w modelu ActiveRecord
, więc nie trzeba się martwić zbytnio o rachunku eval
.
$('form').bind('ajax:success', function(event, data) {
new Model(eval(data)); // Your newly created Backbone.js model
});
Szyny Kontroler:
class PostsController < ApplicationController
respond_to :js
def create
@post = Post.create(params[:post])
respond_with @post
end
end
Szyny View (create.js.haml):
Używanie klejnotu remotipart.
To zajmie się sprawą, gdy formularz będzie ładował pliki z ustawieniem enctype
, a gdy nie.
Możesz tu zadzwonić pod numer sanitize
w swojej odpowiedzi.
= remotipart_response do
- if remotipart_submitted?
= "eval(#{Yajl::Encoder.encode(@post)});"
- else
=raw "eval(#{Yajl::Encoder.encode(@post)});"
Schludny. Jednak dwa pytania. Czy w twoim kontrolerze masz zamiar zrobić "Post.new (params [: post])" lub czy faktycznie masz na myśli 'Post.create (params [: post])'? Po drugie, gdzie można umieścić callback '$ ('form'). Bind ('ajax: success')' w klasie Backbone.View dla danego formularza? Dzięki! –
Świetny połów, literówka z mojej strony. Powinien to być 'Post.create'. Chciałbym umieścić $ ("formularz"). Bind ("ajax: success") w moim widoku kręgosłupa, który renderuje formularz. –
Dodaj data-type = "json" do formularza i możesz usunąć widok. – maletor