0

私のコントローラーの 1 つで、beforeInterceptor クロージャーにいくつかのエラー チェック コードを書きました。

 if (getUser()?.courses?.size() == 0) {
        render(view: '/base/errorMessage', model: [errorMessage: "You don't have any courses!"]);
        return false;
 }

その render 呼び出しは、プログラム全体のエラー ページを表示します。

ただし、false を返すと何も表示されません。true を返すと、エラー ページは正常に表示されますが、アクションは実行されます (レンダリングされませんが、ロジックは実行されます)。これには重複したエラー チェックが必要であり、インターセプターの目的が無効になります。

redirect() 呼び出しは引き続き正常に機能しますが、エラー表示を別のアクションに移動するのは面倒です。/app/courses の代わりに、ユーザーの URL に /app/error/errorMessage が表示され、エラー ページに直接移動できます。次に、そのアクションにメッセージを取得するという問題があります-flash.message? session.var?

より良い方法はありますか?

4

3 に答える 3

0

Grails URL マッピングのセクション 6.4.4 (応答コードによるマッピング)をご覧になることをお勧めします: リクエストを「共有 500 サーバー エラー ページ」にリダイレクトできます。

static mappings = {
   "500"(controller:"errors", action:"serverError")
   "404"(controller:"errors", action:"notFound")
   "403"(controller:"errors", action:"forbidden")
}

さらに、上記のリンクにも記載されているコントローラー/アクションに URL を変更できることをご存じないかもしれません。

于 2011-02-20T16:25:00.150 に答える
0

更新:フィルターは明らかにこの問題に悩まされていません。ただし、そのためにはロジックをコントローラーから分離する必要があります。世界の終わりではありません。

私が見逃したより良い方法がある場合に備えて、質問を残します。

于 2011-02-19T16:04:26.480 に答える
0

これが数年前のものであることは知っていますが、質問はまだ関連していると思います。

Grails は、コマンド オブジェクトと i18n message.properties を使用して、フォーム入力を検証し、フラッシュ エラー メッセージを返すためのより便利な方法を提供しています。

基本的に、インターセプターを作成する必要はありません。送信時に取得する必要があるすべてのフォーム フィールドを含むコマンド オブジェクトをコントローラーに作成します。次に、各フィールドの検証制約を作成し、制約違反エラーの i18n メッセージを作成します。

ここで、コントローラー アクションを定義し、コマンド オブジェクトをパラメーターとして挿入すると、次のようになります。

def someAction(MyCommandObject command) {}

コマンド オブジェクト パラメータは、Grails がフォーム送信からのデータをコマンド オブジェクトの一致する属性に自動的にバインドするという点で、beforeInterceptor のように機能しますが、ちょっと待ってください! それがすべてではありません!また、Grails はフォームからのデータに制約を適用し、基本的にアクションでコードが実行される前にすべてを実行しますcommand.validate()。そのため、次のように、アクションで他のコードを実行する前に、コマンド オブジェクト インスタンスのエラーをチェックすることをお勧めします。

def someAction(MyCommandObject command) {
    if(command.hasErrors()){
        //do something -- set flash message error and redirect, etc.
    }
    //other importand code follows ...
}

これが、この質問に関連性があると思われる他の人に役立つことを願っています。これは、コマンド オブジェクトがいかに便利で強力であるかを示す一例にすぎません。

于 2015-06-12T18:52:27.957 に答える