2013-01-11 19 views
7

Grailsを初めて使いました。私はあなたのほとんどが簡単にできる質問があります。grails - フラッシュメッセージを表示

私はobjectリストを表示しているページがあります。 objectが削除されたときにDataIntegrityViolationがある場合はメッセージを表示します。私がやっていることは次のとおりです。

def delete() { 

    def instanceToDelete= Myobject.get(params.id) 
    try { 
     instanceToDelete.delete(flush: true) 
     redirect(action: "list", id: params.id) 
    } 
    catch (DataIntegrityViolationException e) { 
     flash.message = "some message" 
     //I want to refresh the div containing the flash.message here 
    } 
} 

ここでは、フラッシュ・メッセージが表示されるべきところである。

<g:if test="${flash.message}"> 
    <div class="alert alert-error" style="display: block">${flash.message}</div> 

申し訳ありません - 私はそれは愚かな質問ですけど、私は本当にすることはできません解答を見つける。

+0

何について質問がありますか?それは正しいコードと思われ、DataIntegrityViolationExceptionがキャッチされている場合、表示されている "メッセージの一部"の文字列が表示されます。 –

+0

問題は私には見えないです – sara

+0

私は今見ます。あなたはスタイルについて話しています。少し誤解(= –

答えて

18

flashオブジェクトは、キーと値のペアを格納するMapであるため、エラーメッセージ用に独自のキーを定義できます。たとえば、次のように

try { 
    instanceToDelete.delete(flush: true)    
    flash.message = "successfully deleted object" 
} 
catch (DataIntegrityViolationException e) { 
    flash.error = "could not delete object"    
} 
redirect(action: "list", id: params.id) 

次にあなたがerrorキーを含むflashオブジェクトをチェックして、メッセージのようなもののために別のスタイルを使用することができます。

<g:if test="${flash.error}"> 
    <div class="alert alert-error" style="display: block">${flash.error}</div> 
</g:if> 
<g:if test="${flash.message}"> 
    <div class="message" style="display: block">${flash.message}</div> 
</g:if> 
+0

リダイレクトせずにメッセージを表示するにはどうすればいいですか?基本的にはリストにリダイレクトしたくない – sara

+1

Ajax経由でリクエストを送信しない限り、ブラウザのリロード(サーバーのリダイレクト/フォワード)なしでクライアントデータを変更することはできません。 – Gregg

1

厳格な答え:ちょうどあなたのメッセージを返す(またはレンダリングお使いのコントローラの

)モデルマップ付き:

def delete() { 

    def instanceToDelete= Myobject.get(params.id) 
    try { 
     instanceToDelete.delete(flush: true) 
     redirect(action: "list", id: params.id) 
    } 
    catch (DataIntegrityViolationException e) { 
     render view:'delete', model:[message: "some message"] 
     //I want to refresh the div containing the flash.message here 
    } 
} 
あなたのGSPのため

<g:if test="${message}"> 
    <div class="alert alert-error" style="display: block">${message}</div> 

しかしグレッグは右である、あなたはredirectせずに、クライアントのデータを変更することはありません。 この場合、ユーザーは同じURLをリフレッシュ(または戻ってくる)して、誤って同じ操作を再度試みる可能性があります。あなたは本当にhitt5の答えのようにする必要があります。

3

これはあなたを助けることができます。

def delete() { 
    def instanceToDelete= Myobject.get(params.id) 
    try { 
     instanceToDelete.delete(flush: true) 
     flash.success = "Object deleted correctly" 
    } catch (DataIntegrityViolationException e) { 
     flash.error = "Something goes wrong" 
    } 
    redirect(action: "list", id: params.id) 
} 

が誤りであるか、すべてがうまくいけば保存することができますし、すべてのコードの後に​​GSPにリダイレクトします。

メッセージを異なる変数に入れて、エラーと成功を区別することができます。

<g:if test="${flash.success}"> 
    <div class="alert alert-success" style="display: block">${flash.success}</div> 
</g:if> 
<g:if test="${flash.error}"> 
    <div class="alert alert-error" style="display: block">${flash.error}</div> 
</g:if>