2012-02-16 16 views
11

Cuando el usuario hace clic en un elemento específico, utilizo jQuery's post method para actualizar algo en la base de datos:¿Cómo fallar la solicitud de Ajax en Rails?

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

donde update_something se parece a esto:

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

El problema es que si update_attributes falla, la solicitud todavía tiene éxito y success_handler se ejecuta.

¿Cómo puedo hacer que la solicitud falle cuando update_attributes falla de modo que success_handler no se ejecute?

Respuesta

26

Puede hacerlo render :status => 400 (o algún otro código de error) en los carriles, lo que dará lugar a la error de devolución de llamada de $.ajax(), o puede hacer que algunos JSON con un mensaje de error:

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

Luego, en su función success_handler lo haría:

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

Editar:

Oh, y update_attributes devuelve falso cuando falla. Para que pueda representar su respuesta en función de eso.

Editar 2 años más tarde:

Después de un par de años y ver que esto tiene unos upvotes, yo recomiendo usar el método status: 400 en lugar de la prestación de 200. Es lo que el controlador error en las solicitudes AJAX es para, y debe utilizarse de esa manera.

4

Bueno, tiene que agregar un controlador de errores y darle un error de manejo. Así, en su JavaScript:

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

Y en rieles:

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 puede o no puede ser el código de error apropiado en este caso, elegir el que más entre los 400s and 500s es apropiado.

+0

Gracias! No estaba familiarizado con los métodos 'success' y' error' de jQuery. Intenté buscar documentos pero no tuve éxito. ¿Podría proporcionar un puntero, por favor? –

+1

+1 También puede devolver un encabezado de éxito/error. Su última línea en Rails se vería como 'éxito de cabeza? : ok:: internal_server_error', donde 'head: ok' devolverá el estado 200, y' head: internal_server_error' devolverá el estado 500. – Substantial

+0

Misha: 'post',' get', y 'ajax' devuelve un objeto jqXHR que es (mal) [documentado aquí] (http://api.jquery.com/jQuery.ajax/#jqXHR). Leyendo ese acercamiento noté que 'error' y' success' están en desuso y ahora debes usar [Deferred] (http://api.jquery.com/category/deferred-object/) 'done' y' fail' . He actualizado mi código para reflejar esto, así como también he incorporado el consejo de @gg_s, que es un buen consejo. –

Cuestiones relacionadas