Estoy teniendo un pequeño problema para que el jQuery Form Plugin funcione correctamente con un campo de carga de archivos. Cuando uso el complemento para enviar el formulario sin un campo de carga de archivos, se llama correctamente a la parte format.json
del bloque respond_to do |format|
. Sin embargo, al agregar el campo de carga de archivos, solo ejecuta la parte format.html
, lo que hace que mi código de JavaScript piense que se ha producido un error.Usando respond_to ... format.json y jQuery Form Plugin por malsup
¿Alguien se ha encontrado con esto antes o sabe una forma de forzar al plugin a usar siempre json? Alternativamente, ¿puedo modificar la URL que usa el complemento para forzar a Rails a renderizar el json?
Muchas gracias por cualquier ayuda! Código debajo:
# app/controllers/details_controller.rb
def create
@detail = Detail.new(params[:detail])
style = params[:detail_style].to_sym || :thumb
data = { :id => '5', :url => 'test.rails' }
respond_to do |format|
if @detail.save
flash[:notice] = 'Your image has been saved.'
data = { :id => @detail.id, :url => @detail.data.url(style) }
format.html { redirect_to :action => 'index' }
format.json { render :json => "<textarea>#{data.to_json}</textarea>", :status => :created }
else
format.html { render :action => 'new' }
format.json { render :json => @detail.errors, :status => :unprocessable_entity }
end
end
end
/* app/views/sidebar/_details.html.erb (excerpt) */
<% form_for(Detail.new, :html => { :multipart => true }) do |f| %>
<%= hidden_field_tag 'detail_style', 'thumb' %>
<%= f.label :image, "Recent Images" %>
<%= f.file_field :image%>
<p>
<%= f.submit "Upload" %>
</p>
<% end %>
<script>
$(document).ready(function() {
var options = {
dataType: 'json',
success: function(json, statusText) {
console.log("success: " + json);
},
error: function(xhr, statusText, errorThrown) {
console.log("error: " + xhr.responseText);
}
};
$('#new_detail').ajaxForm(options);
});
Intenté configurar el encabezado Accept, en la devolución de llamada beforeSend, pero esto no tuvo ningún efecto. Cuando miré el código de jQuery.form, el objeto XHR que se pasó a beforeSend tiene una función vacía inicializada en "setRequestHeader". Sin embargo, estoy viendo la versión 2.16 del archivo, quizás haya cambios en las versiones posteriores. – Prashant