2012-02-25 20 views
12

Per qualche motivo usare la gemma CarrierWave con Ajax non sembra funzionare per me. Sto facendo qualcosa di sbagliato? Ho seguito bene il 253 CarrierWave Railscast e funziona senza AJAX, ma nella mia applicazione ho bisogno di usare AJAX. Qui è il mio codice:Il gioiello Ruby on Rails CarrierWave funziona con Ajax?

L'elenco params dopo aver selezionato un jpeg nel campo file di immagine:

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 

Ho la gemma carrierwave nel mio Gemfile e non ho cambiato nulla nella cartella app/uploader/image_uploader.rb.

Grazie per tutto il vostro aiuto!

risposta

14

Non c'è nulla che possa essere fatto senza usare una libreria come Uploadify. Questo perché lo standard XMLHttpRequest (AJAX) non supporta i caricamenti di file. L'unico modo in cui puoi davvero fingere è usare un iFrame con Flash. Uploadify è la migliore di queste opzioni e ha la migliore documentazione. Questo è ciò che deve essere fatto sul lato client (browser). Uploadify in realtà non è una gemma rubino, è una raccolta di flash e js per consentire al browser di "falsificarlo".

Sul lato server, è possibile utilizzare carrierwave per supportare i caricamenti, ma è necessario un modo per ottenerli dal lato client. Ecco una domanda estremamente simile che dovrebbe darti le istruzioni che ti servono.

Rails Carrier Wave with JQuery Uploader

Spero che questo aiuti,

Joe

+2

Allora mi dai la mia taglia? – TheDelChop

+1

Come indicato nell'altra risposta di seguito, a meno che non sia necessario supportare i browser meno recenti [XHR2] (http://caniuse.com/#feat=xhr2) ha supportato 'FormData' per un po 'di tempo. Vale la pena provarlo se è disponibile per te e se torni solo ad altre librerie per il supporto legacy. – mczepiel

+3

A questo punto questa risposta è obsoleta. HTML5 ha le API FormData e File che consentono il caricamento di file tramite AJAX. Vedi [qui] (http://stackoverflow.com/questions/166221/how-can-i-upload-files-asynchronous/8758614#8758614) per ulteriori informazioni. –

-1

Non è possibile caricare un file tramite ajax in questo modo. Avrete bisogno di qualcosa del tipo: http://www.uploadify.com/

+0

Perché non si può fare? È perché CarrierWave non supporta i submission Ajax? Sto provando a usare la quantità minima di gemme. Grazie – EverTheLearner

+0

Perché XMLHttpRequest non supporta i caricamenti di file. – tybro0103

+0

Cura di spiegare il downvote? La mia risposta è la stessa di quella accettata, anche la risposta prima. Ora sappiamo che puoi effettivamente usare ajax per caricare un file nei browser moderni, ma se vuoi supportare quelli più vecchi (IE8), avrai ancora bisogno di un work-around. – tybro0103

8

È ora possibile caricare file tramite ajax senza l'utilizzo di librerie esterne utilizzando formdata()

VEDI: LINK 1 & LINK 2