13

ユーザーが特定の項目をクリックすると、jQuery の post メソッドを使用してデータベース内の何かを更新します。

$.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

4

2 に答える 2

28

のコールバックをrender :status => 400トリガーする Rails で (またはその他のエラー コード) を実行するか、エラー メッセージを含む JSON をレンダリングすることができます。error$.ajax()

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

次に、success_handler関数で次のようにします。

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

編集:

ああ、update_attributes失敗すると false を返します。したがって、それに基づいて応答をレンダリングできます。

2年後に編集:

数年後、これにいくつかの賛成票があることがわかったので、 render のstatus: 400代わりにメソッドを使用することを強くお勧めします200。これerrorは、AJAX リクエストのハンドラーの目的であり、そのように使用する必要があります。

于 2012-02-16T05:18:22.867 に答える
6

エラー ハンドラを追加して、処理するエラーを指定する必要があります。したがって、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のどちらか適切なものを選択してください。

于 2012-02-16T05:20:13.237 に答える