3

通常のリクエストを行う場合、次の例のように UrlMappings.groovy でエラーと例外の処理を定義できます。

    "403"(controller: 'error', action: 'index', params:['code':'403'])
    "404"(controller: 'error', action: 'index', params:['code':'404'])
    "500"(controller: 'error', action: 'index', params:['code':'500'])
    "500"(controller: 'home', action: 'noPrivileges', exception: IllegalOperationException)

次に、特定のコントローラーでエラーを処理し、選択したビューをレンダリングできます。

class ErrorController {

    def index = {
        render view: "/errors/myErrorPage", model: [code: params.code]
    }
}

これは完全に機能し、サーバーにエラーがあるたびにエラーページが表示されます。

ajaxリクエストに対してまったく同じ動作を実現するにはどうすればよいですか? grails remoteFunctionまたはformRemoteを使用して ajax リクエストを作成しています。サーバーで例外が発生するたびに、javascript で同じコードを実行したい (たとえば、alert('There was an exception') でアラートを表示したい)。

上記のアプローチは、ajax リクエストでは機能しません。それでもエラーが返され、エラーに myErrorPage.gsp のコンテンツがあっても、formRemote または remoteFunction の update パラメータで指定した html 要素に出力されません。

4

3 に答える 3

6

最終的に、標準的なリクエストを処理するために使用されるアプローチと互換性のある完全にクリーンなソリューションを見つけました。

次の例のように、エラーを処理しているアクションを変更する必要があります。

class ErrorController {

    def index = {
        if (request.xhr) {
             response.status = 200
             render template: "/errors/myAjaxErrorTemplate", model: [code: params.code]
        } else {
             render view: "/errors/myErrorPage", model: [code: params.code]
        }
    }
}

request.xhr を使用すると、ajax リクエストと標準リクエストを区別できます。ajax リクエストでは、さらに、レスポンス ステータスを 200 に設定して、レスポンスが OK であることを grails に伝える必要があります。

とても素敵できれいです。:)これがどこにもグーグルで検索できないことに驚いています...

于 2012-08-31T13:59:18.263 に答える
1

いくつかのイベントをremoteFunctionトリガーし、. そのイベントを使用して、警告メッセージを表示できます。onFailureon_ERROR_CODE

ドキュメントで詳細を確認できます

于 2012-08-31T12:44:11.850 に答える
0

リクエスト ステータスが正しく設定されている場合は、 /のonFailure属性を介して JavaScript 関数を定義できます。remoteFunctionformRemote

この関数内で、クライアント側で例外を処理できます。

ドキュメントのサンプルを使用すると、次のようになります。

<select onchange="${remoteFunction(action: 'bookByName',
                       update: [success: 'great', failure: 'ohno'],
                       params: '\'bookName=\' + this.value'),
                       onFailure: 'handleError'}">
    <option>first</option>
    <option>second</option>
</select>
于 2012-08-31T12:41:49.340 に答える