2012-02-25 14 views
12

Por alguna razón, el uso de la gema CarrierWave con Ajax no parece funcionar para mí. ¿Estoy haciendo algo mal? Seguí bien el 253 CarrierWave Railscast y funciona sin AJAX, pero en mi aplicación necesito usar AJAX. Aquí está mi código:¿Funciona la gema CarrierWave de Ruby on Rails con Ajax?

La lista params después de seleccionar un archivo JPEG en el campo de archivo de imagen:

Parameters: {"item"=>{"remote_image_url"=>""}} 

new.html.erb:

<%= form_for(@item, :url => create_item_path, :html => {:id => "create_item_form", :multipart => true}) do |f| %> 
    <p> 
     <%= f.file_field :image %> 
    </p> 
    <p> 
     <%= f.label :remote_image_url, "or image URL" %><br /> 
     <%= f.text_field :remote_image_url %> 
    </p> 
    <%= f.submit "Save", :id => "save_button" %> 
<% end %> 

application.js

$("#create_item_form").submit(function() { 
    $.ajax({ 
     type: "POST", 
     url: $(this).attr("action"), 
     dataType: "script", 
     data: $("#destination_item").sortable('serialize') + "&" + $(this).serialize() 
     }); 
     return false; 
}); 

item.rb

class Item < ActiveRecord::Base 
    attr_accessible :description, :image, :remote_image_url 
    belongs_to :user 
    has_many :item_sub 
    mount_uploader :image, ImageUploader 
end 

schema.rb

create_table "item", :force => true do |t| 
    t.integer "user_id" 
    t.string "title" 
    t.string "image" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

que tienen la gema carrierwave en mi Gemfile y no he cambiado nada en la aplicación/cargadores/image_uploader.rb.

¡Gracias por toda su ayuda!

Respuesta

14

No hay nada que se pueda hacer sin utilizar una biblioteca como Uploadify. Esto se debe a que el estándar XMLHttpRequest (AJAX) no admite cargas de archivos. La única forma en que realmente puedes simular esto es usando un iFrame con Flash. Uploadify es la mejor de estas opciones y tiene la mejor documentación. Esto es lo que tiene que hacerse en el lado del cliente (navegador). Uploadify realmente no es una joya de rubí, es una colección de flash y js para permitir que el navegador 'lo falsifique'.

En el lado del servidor, puede usar carrierwave para admitir las cargas, pero necesita una forma de obtenerlas desde el lado del cliente. Aquí hay una pregunta extremadamente similar que debe darle las instrucciones que necesita.

Rails Carrier Wave with JQuery Uploader

Espero que esto ayude,

Joe

+2

¿Me darás mi recompensa entonces? – TheDelChop

+1

Como se señala en la otra respuesta a continuación, a menos que necesite admitir navegadores más antiguos [XHR2] (http://caniuse.com/#feat=xhr2) ha sido compatible con 'FormData' desde hace algún tiempo. Vale la pena intentarlo si está disponible para ti y solo recurrir a otras bibliotecas para obtener soporte heredado. – mczepiel

+3

En este punto, esta respuesta está desactualizada. HTML5 tiene las API FormData y File que permiten la carga de archivos a través de AJAX. Ver [aquí] (http://stackoverflow.com/questions/166221/how-can-i-load-files-asynchronously/8758614#8758614) para más información. –

-1

No puede cargar un archivo a través de ajax como ese. Necesitará algo como: http://www.uploadify.com/

+0

¿Por qué no se puede hacer? ¿Es porque CarrierWave no admite los envíos de Ajax? Estoy tratando de usar la cantidad mínima de gemas. Gracias – EverTheLearner

+0

Porque XMLHttpRequest no admite la carga de archivos. – tybro0103

+0

¿Cuidar para explicar el voto a favor? Mi respuesta es la misma que la aceptada, incluso respondida antes. Ahora sabemos que puedes usar ajax para cargar archivos en navegadores modernos, pero si quieres admitir archivos anteriores (IE8), necesitarás una solución alternativa. – tybro0103

8

Ahora puede subir archivos a través de ajax sin el uso de bibliotecas externas mediante el uso de FormData()

VER: LINK 1 & LINK 2