2014-04-05 11 views
7

Sto completando un caricamento di avatar e ritagliare usando ajax submit.Rails ajax con funzione POST: perché manca il modello?

Sto inviando tramite ajax l'immagine di base64 e quindi converto la mia immagine per carrierwave.

Tutto funziona correttamente, tranne la risposta ajax: modello mancante.

Questa è la mia chiamata AJAX:

$.ajax({ 
    type: "post", 
    dataType: "json", 
    url: "/profile/update_avatar", 
    data: { image: canvas.toDataURL() } 
}) 
.done(function(data) { 

    // You can pull the image URL using data.url, e.g.: 
    $('.user-image').html('<img src="'+data.url+'" />'); 

}); 

E questo è il mio controller:

def update_avatar 
respond_to do |format| 
    if current_user.update_cropped_avatar(params[:image]) 
    format.js 
    format.html { render :nothing => true, :notice => 'Update SUCCESSFUL!' } 
    else 
    format.html { render :action => "edit" } 
    format.json { render :json => current_user.errors, :status => :unprocessable_entity } 
    end 
end 

fine

Non ho bisogno di rendere template ... ma l'errore è :

Missing template profiles/update_avatar, application/update_avatar with {:locale=>[:it], :formats=>[:js, :html], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :haml]}. 

Perché?

risposta

10

Il problema sarà l'utilizzo di:

respond_to do |format| 
    format.js 

So che hai mandato JSON per Rails, ma sembra che sei solo elaborare uno standard script dataType quando il tuo avatar viene inviato correttamente. L'utilizzo del format.js provoca sostanzialmente rotaie per cercare action_name.js.erb nella cartella views - da qui il vostro errore modello

Ci sono molti modi per risolvere questo problema, tra cui:

respond_to do |format| 
    format.js { render nothing: true } 

Fix

Dopo aver parlato con Roberto in chat, ecco cosa ha funzionato per lui:

def update_avatar 
    respond_to do |format| 
     if current_user.update_cropped_avatar(params[:image]) 
      format.json { render :json => current_user.profile.avatar_url, :status => 200 } 
      format.html { render :nothing => true, :notice => 'Update SUCCESSFUL!' } 
     else 
      format.html { render :action => "edit" } 
      format.json { render :json => current_user.errors, :status => :unprocessable_entity } 
     end 
    end 
end 
+0

nel mio js Ho anche $ ('. User-image'). Html ('') per aggiornare l'immagine. Come posso unirlo con il tuo codice? –

+0

Con il mio codice, tornerai ancora l'oggetto 'image' nella variabile' data' in JS. Quello che dovrai determinare è cosa c'è dentro l'oggetto 'data', e poi chiamare' url' -> se potresti mettere 'console.log (dati)' nel tuo JS 'done', e fammi sapere risultati, sarò in grado di aiutarti meglio –

+0

Sto provando ma nel tuo codice c'è qualcosa che non capisco, dove devo inserire respond_to: html,: json? Nella parte superiore del mio controller? E tu hai qualcosa di sbagliato nel nidificare, non riesco a capire perché hai tre estremità. –

2

Nel metodo di azione del controllore hai scritto format.js Quale è la ragione di questo errore.

Passare a format.json { render :json => true } o nelle proprie viste è possibile creare un file denominato: profiles/update_avatar.js.

Così la vostra azione di controllo dovrebbe essere così:

def update_avatar 
respond_to do |format| 
    if current_user.update_cropped_avatar(params[:image]) 
    format.json { render :json => true } #<-------Change here 
    format.html { render :nothing => true, :notice => 'Update SUCCESSFUL!' } 
    else 
    format.html { render :action => "edit" } 
    format.json { render :json => current_user.errors, :status => :unprocessable_entity } 
    end 
end 
Problemi correlati