2011-02-19 10 views
0

私のコントローラの1つでは、beforeInterceptorクロージャでエラーチェックコードを書いています。Grails:beforeInterceptorのページをレンダリングする

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

このレンダーコールは、プログラム全体にわたる素晴らしいエラーページを表示します。

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

redirect()コールはまだ正常に動作しますが、エラー表示を別のアクションに移動するのは面倒です。/app/coursesの代わりに、URLに/ app/error/errorMessageが表示され、エラーページに直接移動することができます。それでは、そのアクションにメッセージを送るという質問があります - flash.message? session.var?

良い方法がありますか?

答えて

0

私はこれが数年前であることを知っていますが、その質問は依然として関連していると思います。

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

基本的に、インターセプタを書く必要はありません。コントローラーにコマンドオブジェクトを作成するには、送信時に取得するすべてのフォームフィールドを使用します。次に、各フィールドの検証制約を作成し、制約違反エラーのi18nメッセージを作成します。あなたはコントローラのアクションを定義し、パラメータとしてコマンドオブジェクトを挿入するとき

は今、:

def someAction(MyCommandObject command) {} 

をコマンドオブジェクトパラメータは、そのGrailsの中で、ややbeforeInterceptorのように動作し、自動的にフォームからのデータは一致に提出バインドコマンドオブジェクトの属性 - しかし、待つ!それがすべてではありません! Grailsはフォームからのデータに制約を適用し、基本的にcommand.validate()を実行します。BEFOREアクションでコードが実行されます。

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

私は、これは、この質問は、関連するかもしれない他の人に役立ちます願っています:それはあなたがそうのように、自分の行動に他のコードを実行する前に、エラーについて、コマンドオブジェクトのインスタンスをチェックする良い、と一般的な方法がある理由です。これは、どのように有用で強力なコマンドオブジェクトができるかの一例に過ぎません。

0

更新:Filters明らかにこの問題は発生しません。しかし、それはコントローラからロジックを分離する必要があります。世界の終わりではありません。

私が逃したよりよい方法がある場合は、質問を残しておきます。

0

私はあなたがGrails URL Mapping, Section 6.4.4 (mapping by response code)を見てお勧め:あなたがリダイレクトすることができますが、「共有500サーバー・エラー・ページ」への要求

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

をまた、私はあなたがあなたにURLを変更することができることを知らないかもしれないと思いますコントローラー/アクション(上のリンクでも言及されています)。

+0

これは本当に私を助けません - 私は単にコントローラを傍受し、ユーザーにメッセージを表示しようとしています。実際の例外ではありません。 –

関連する問題