2012-03-07 12 views
5

Nella mia attuale app per rotaie sto usando una libreria ajax uploader che richiede di rispondere con json {success:true} per indicare che un file è stato caricato con successo.Rails JS Response, rende sia lo stato che il modello?

Nella mia app i file sono immagini, e dopo il caricamento vorrei aggiungere questo alla pagina. Normalmente avrei fatto qualcosa di simile:

respond_to do |format| 
    format.html { redirect_to @resource, :notice => 'Created.' } 
    format.js 
end 

Nell'esempio sopra la mia risposta JS renderebbe il modello appropriato, come ad esempio create.js.erb che potrebbe dire qualcosa di simile ...

$('#resources').append('<%= escape_javascript(render '@resource') %>'); 

Ecco come ho fatto cose come commenti Ajax ecc. in passato. Ora, per ottenere l'uploader lavorando il mio respond_to blocco attualmente fa questo:

format.js { render :json => { :success => true } } 

Questo rende il lavoro uploader, ma sembra precludere me aggiungendo parziali resi alla pagina, come ho normalmente con una risposta Ajax.

La mia domanda è, c'è un modo per realizzare entrambi? In caso contrario, come compilare la pagina con oggetti sottoposti a rendering dopo che sono stati creati correttamente?

risposta

3

Non è possibile eseguire entrambe le operazioni direttamente dal controller o utilizzando i modelli di visualizzazione. Sembra che l'uploader di jax si aspetti una risposta che può essere analizzata come JSON, quindi l'aggiunta di qualsiasi altra risposta usando un modello (che significherebbe non fare format.js { render :json => { :success => true }}) non restituirà JSON come corpo della risposta.

Guardando il source per il plug-in, è possibile vedere che è possibile definire un metodo per eseguire onComplete che fornirà la risposta JSON.

Questo non è verificato, ma dovrebbe farti chiudere. Quindi, se estendere la risposta JSON come

format.js do 
    partial = render_to_string @resource 
    render :json => { :success => true, :partial => partial } 
end 

Poi, nel tuo javascript sulla pagina quando si imposta il caricamento ajax, aggiungere il callback

var uploader = new qq.FileUploader({ 
    element: document.getElementById('file-uploader'), 
    action: '/upload', 
    onComplete: function(id, fileName, responseJSON) { 
    $('#resources').append(responseJSON.partial); 
    } 
}); 
+0

Questa idea funziona. Non sapevo di 'rendering_to_string', ma nei test ho scoperto che potevo usare anche' .getScript' nella callback per recuperare il partial. Il tuo metodo è più pulito. Grazie! – Andrew

+0

Una nota ... per default 'escape_javascript' non è disponibile per il controller, e non è necessaria perché il metodo' render: json' lo fa comunque. – Andrew

+0

cool, felice che aiuti. Ha senso che "escape_javascript" non funzioni lì, non so cosa stavo pensando. Grazie per il feedback sulla risposta – danivovich

Problemi correlati