Как провалить Ajax-запрос в Rails? - PullRequest
12 голосов
/ 16 февраля 2012

Когда пользователь щелкает конкретный элемент, я использую метод публикации jQuery для обновления чего-либо в базе данных:

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

, где update_something выглядит так:

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

Проблема в том, что если update_attributes не удается, запрос все еще выполняется успешно и success_handler выполняется.

Как я могу вызвать сбой запроса при сбое update_attributes, так что success_handler выиграл 'не быть выполненным?

Ответы [ 2 ]

28 голосов
/ 16 февраля 2012

Вы можете либо сделать render :status => 400 (или какой-либо другой код ошибки) в Rails, что вызовет error обратный вызов $.ajax(), либо вы можете отрендерить JSON с сообщением об ошибке:

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

Тогда в вашей функции success_handler вы бы:

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

Edit:

Oh, и update_attributes возвращает false, если это не удалось.Таким образом, вы можете обработать ваш ответ на основании этого.

Редактировать 2 года спустя:

Через пару лет и после того, как у этого есть несколько голосов, я настоятельно рекомендую использовать status: 400метод вместо рендеринга 200.Для этого и нужен обработчик error в запросах AJAX, и его следует использовать таким образом.

4 голосов
/ 16 февраля 2012

Ну, вы должны добавить обработчик ошибок и дать ему ошибку для обработки.Итак, в вашем JavaScript:

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

И в 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

Примечание: 500 может быть или не быть подходящим кодом ошибки здесь -выберите подходящий из 400 и 500 * .

...