2012-02-16 11 views
11

Quando l'utente fa clic su un elemento specifico, io uso jQuery's post method aggiornare qualcosa nel database:Come fallire la richiesta Ajax in Rails?

$.post("/posts/" + post_id + "/update_something", 
     { some_param: some_value }, 
     success_handler); 

dove update_something assomiglia a questo:

def update_something 
    post = Post.find(params[:id]) 
    post.update_attributes(:some_field => params[:some_param]) 
    render :nothing => true 
end 

Il problema è che se update_attributes fallisce, la richiesta riesce ancora e success_handler viene eseguito.

Come è possibile causare il fallimento della richiesta quando update_attributes non riesce a eseguire success_handler?

risposta

26

È possibile fare render :status => 400 (o qualche altro codice di errore) in Rails, che attiverà la error callback di $.ajax(), oppure si può rendere alcuni JSON con un messaggio di errore:

render :json => { :success => false }

Poi, nel il vostro success_handler funzione si farebbe:

function success_handler (response) { 
    if (response.success) { 
     // do stuff 
    } 
} 

Edit:

Oh, e update_attributes restituisce false quando fallisce. Quindi puoi rendere la tua risposta basandoti su quello.

Edit 2 anni dopo:

Dopo un paio di anni e visto che questo ha un paio di upvotes, mi raccomando utilizzando il metodo status: 400 invece di rendere 200. È ciò che il gestore error in richieste AJAX ha per e deve essere utilizzato in questo modo.

4

Bene, è necessario aggiungere un gestore di errori e dargli un errore da gestire. Così, nel vostro JavaScript:

$.post("/posts/" + post_id + "/update_something", 
     { some_param : some_value } 
    ) 
    .done(successHandler) 
    .fail(errorHandler)  // define errorHandler somewhere, obviously 
; 

E in Rails:

def update_something 
    post = Post.find params[ :id ] 

    success = post.update_attributes :some_field => params[ :some_param ] 

    head success ? :ok : :internal_server_error 
end 

Nota:500 può o non può essere il codice di errore appropriato qui-scegliere quale tra i 400s and 500s è appropriato.

+0

Grazie! Non avevo familiarità con i metodi 'success' e' error' di jQuery. Ho cercato di cercare documenti ma nessun successo. Potresti fornire un puntatore per favore? –

+1

+1 Potresti anche solo restituire un'intestazione riuscita/fallita. La tua ultima riga in Rails sembrerebbe un successo? : ok:: internal_server_error', dove 'head: ok' restituirà lo stato 200 e' head: internal_server_error' restituirà lo stato 500. – Substantial

+0

Misha: 'post',' get' e 'ajax' restituiscono un oggetto jqXHR che è (male) [documentato qui] (http://api.jquery.com/jQuery.ajax/#jqXHR). Leggendolo più da vicino ho notato che 'error' e' success' sono deprecati e ora dovresti usare [Deferred] (http://api.jquery.com/category/deferred-object/) 'done' e' fail' . Ho aggiornato il mio codice per rispecchiare questo, oltre a incorporare il consiglio di @ gg_s, che è un buon consiglio. –

Problemi correlati