[Grails (グレイルズ) ] org.codehaus.groovy.runtime.GStringImpl cannot be cast to java.lang.String ようなエラー

マップのキーに GString を使用しているとエラーになる。

こんな感じで使っていたらアウト

こういう風にする

変数に文字列とか連結したい時は、




[Grails (グレイルズ) ] flash で設定したメッセージが再度表示される

flash のスコープは、次のリクエストまで有効である。
以下のように flash にメッセージを入れて画面を表示した場合

すぐに render するとその次のリクエストでも値が有効になり、エラーメッセージが再度表示されてしまう。

想定としては、redirect した時にリダイレクト先で表示した view に値を渡す場合である。
以下の場合だと、show にリダイレクトしてその先で表示した view のリクエストまで有効であるので、その先には表示されない。

flash を使って、redirect ではなく render で表示した場合にメッセージの再表示を抑える方法は二つある。

  1. flash のメッセージを表示したら flash の内容を初期化する
  2. view 側で、以下のように flash.messagenull を入れる

  3. render の時は、flash ではなく request を使う
  4. contorller 側では以下のようにする

    view 側では以下のようにする

    お勧めというか、私がやった対応は、上記 1 の対応。
    処理によって、request だったり flash だったり切り分けるのが面倒なので、画面に表示する情報は全て flash スコープ変数に入れた。