2013-09-24 11 views
5

Ho cercato dappertutto SO per una risposta, quindi sono sicuro che questo non è stato chiesto prima. Per favore aiutami, o salvatore!Rails: s3_direct_upload - Come posso salvare/utilizzare la risposta dati?

Sto cercando di utilizzare la gemma s3_direct_upload per gestire il caricamento dei file direttamente su S3, ma non so come visualizzare/utilizzare/salvare i dati che apparentemente vengono restituiti dal server S3. Ho letto README per s3_direct_upload una dozzina di volte e fornisce alcuni esempi di codice JS ma non mi dice dove dovrebbe andare quel codice.

Ho lavorato tutta la prima parte del README e impostare AWS config e la semplice jQuery

jQuery -> 
    $("#s3-uploader").S3Uploader() 

Nel mio CoffeeScript (che è incluso in cantiere risorsa correttamente).

ho questo a mio avviso:

<%= s3_uploader_form callback_url: work_path, callback_param: "work[url]", class: "s3-uploader" do %> 
    <%= file_field_tag :file, multiple: false %> 
<% end %> 

<%= form_for(@work) do |f| %> 

    <%= f.label :name, "Title" %> 
    <%= f.text_field :name %> 
    <%= f.label :category, "Category" %> 
    <%= f.text_field :category %> 
    <br> 
    <%= f.submit "Upload", id: "btn-upload-work", class: "btn btn-large btn-warning btn-upload" %> 

<% end %> 

voglio all'utente di caricare un work e compilare alcuni campi. Quando l'utente fa clic sul pulsante "Upload", è necessario creare un nuovo work con l'attributo :url uguale all'URL del file caricato, nonché gli attributi :name e :category uguale al testo immesso dall'utente. Quindi la pagina dovrebbe reindirizzare alla pagina show dell'opera inviata. Il README fornisce questo esempio:

$('#myS3Uploader').bind "s3_upload_complete", (e, content) -> 
    $('#someHiddenField').val(content.url) 

Ma non ho idea di dove mettere questo bit di codice.

Questo è il mio controllo: (lo so l'azione create bisogno di cambiamenti, ma non so esattamente quello che ho sperimentato per alcune ore con respond_to inutilmente..)

def show 
    @work = Work.find(params[:id]) 
end 

def new 
    @work = Work.new 
end 

def create 
    @work = current_user.works.new(work_params) 
    if @work.save 
     flash[:success] = "Work successfully submitted!" 
     redirect_to @work 
    else 
     render 'new' 
    end 
end 

private 

    def work_params 
     params.require(:work).permit(:name, :category, :url)    
    end 

Anche dopo leggendo il README una dozzina di volte, continuo a non capire cosa sia veramente lo callback_url, che cos'è callback_param e come lavorare con loro. Ancora peggio, il caricamento di questa vista dà un errore: a Rails non piace la porzione callback_url: work_path. Ho dovuto cambiarlo a work_path(@work) per farlo caricare, ma non sono sicuro se è giusto (dato che non capisco callback_url).

Dalle domande che tutti gli altri hanno chiesto su s3_direct_upload, sembra che sappiano già come usarlo (le domande sono solo dettagli più piccoli). Quindi sono perso perché non riesco nemmeno a farlo funzionare in primo luogo. Sono un po 'nuovo ai frontend web, quindi ti prego di sopportare me e spiegarmelo. Grazie mille!

risposta

3

io ancora non capisco cosa callback_url realmente è,

callback_url è il percorso che avrebbe postare tramite la tecnologia AJAX dopo la gemma finisce di caricare il file a S3. Quindi work_path(@work) dovrebbe essere ok.

$ ('# myS3Uploader') legare "s3_upload_complete", (e, contenuto) -..>
$ ('# someHiddenField') val (content.url)

ma non ho idea dove mettere questo bit di codice.

È possibile inserire il codice sopra nello stesso file coffeescript dove si inserisce $("#s3-uploader").S3Uploader(). Sostituire $('#someHiddenField').val(content.url) con alert(content.url). In questo modo se il caricamento ha esito positivo riceverai un messaggio di avviso.

incollare anche il seguente codice nello stesso file CoffeeScript

$('#myS3Uploader').bind "s3_upload_failed", (e, content) -> 
    alert("#{content.filename} failed to upload : #{content.error_thrown}") 

Il codice di cui sopra avrebbe mostrato un avviso se ci fosse un errore.

Se non si vede nessuno dei due dopo aver inviato il file, c'è qualche altro problema. Consiglio vivamente di utilizzare firebug. È davvero utile nel debugging delle funzioni javascript lato client. Nel pannello della rete Firebug puoi vedere se la gemma sta effettuando una chiamata al server s3 o meno. Mostrerà anche eventuali errori javascript nel pannello della console.

+0

Grazie per la rapida risposta. Vedo che il file non viene caricato affatto dopo aver inserito un file. Cosa potrebbe impedire l'upload del file? – Tsubaki

+0

ricevi avvisi dopo aver inserito i codici sopra? Se non guardi la console di Firebug per errori. – tihom

+0

Mi sono reso conto che il codice del modulo dovrebbe avere "s3-uploader" come id invece della classe. Il file ora viene caricato correttamente, ma non ricevo alcun avviso. Questo è molto strano (Dove potrei vedere gli avvisi?) – Tsubaki

Problemi correlati