Respondiendo a mi propia pregunta después de algunos meses de prueba utilizando diferentes métodos. Mi solución es la siguiente (con Rails).
Para cualquier forma que requiera la carga de archivos, establecería data-remote="true"
y enctype="multipart/form-data"
e incluiría rails.js y jquery.iframe-transport.js.
Configuración data-remote="true"
con rails.js permite enlazar a ajax:success
y crea el modelo Backbone.js en caso de éxito.
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:
Es obvio que debe unirse ajax:error
para manejar los casos de error.
Para mí, los datos son desinfectados en el modelo ActiveRecord
, por lo que no tiene que preocuparse demasiado acerca de la declaración eval
.
$('form').bind('ajax:success', function(event, data) {
new Model(eval(data)); // Your newly created Backbone.js model
});
rieles controlador:
class PostsController < ApplicationController
respond_to :js
def create
@post = Post.create(params[:post])
respond_with @post
end
end
Rieles (Ver create.js.haml):
Usando la gema remotipart.
Esto tratar el caso en la forma que hace la carga de archivos con el que se establece enctype
, y no cuando lo hace.
Puede elegir llamar al sanitize
en su respuesta aquí.
= remotipart_response do
- if remotipart_submitted?
= "eval(#{Yajl::Encoder.encode(@post)});"
- else
=raw "eval(#{Yajl::Encoder.encode(@post)});"
aseado. Dos preguntas sin embargo. En tu controlador, ¿pretendes hacer 'Post.new (params [: post])' o quisiste decir 'Post.create (params [: post])'? Y segundo, ¿dónde colocarías la devolución de llamada '$ ('form'). Bind ('ajax: success')', en una clase Backbone.View para la forma dada? ¡Gracias! –
Gran captura, error tipográfico de mi parte. Debería ser 'Post.create'. Colocaría $ ('form'). Bind ('ajax: success') en mi vista Backbone que representa el formulario. –
Agregue data-type = "json" al formulario y puede quitar la vista. – maletor