Grails > コントローラ

更新日 2014-12-13
広告

Grailsでは、ブラウザからの要求を受けると、基本的に、コントローラのアクション(メソッド)が呼び出されます。そして、コントローラのメソッドは、「gspファイル」と「gspファイルで利用するデータ」を返します。gspファイルは、ブラウザに返す html のベースとなります。

以下、Hello Worldの例で作成した、HelloController.groovyを例に説明します。

コントローラから、gspファイルを指定する方法は、いくつかあります。 以下のindexアクションは、renderメソッドを使い、grails-app/views/hello/input.gsp を指定します。 アクションは、"def"で宣言する必要があります。

renderメソッドは、gspファイルと、gspファイルに渡すマップ変数を指定します。 (HelloControllerは、'create-controller hello'で作成したコントローラですから、'input'と指定するだけで views/hello 以下の input.gsp が指定されます)。 以下は、2つのkey-valueデータを渡す例です。

def index() {
  render(view: 'input', 
         model: [msg: 'Please input record.', 
                 year: 2012])
}
以下のように、view変数を指定しないと、メソッド名で gsp ファイルが決まります。 以下の場合、input.gsp が指定されます。
def input() {
  return [msg: 'Illegal record parameters found!',
          year: 2012]
}

msgやyearという変数は、gspファイルにおいて${msg}や${year}という形で参照できます。

ちなみに、xmlやjsonのデータは、gspファイルを介さず、アクションメソッド内のrenderメソッドから返せます。公式サイトのsection 7.1.7が参考になります。

リダイレクト

コントローラでリダイレクトする方法を紹介します。 以下の例は、"show"というアクション(メソッド)を呼び出します。 paramsを指定することで、引数を渡すことも可能です。
def messageId = "123"
redirect(action: "show", params: [id: messageId])
別のコントローラにリダイレクトすることも可能です。 以下は、UserController.groovyのshowアクションを呼び出す例です。
redirect(controller: "user", action: "show")

jsonレンダリング時のエラー

Grails Controller内で定義したクラスを as json で rendering しようとしたら以下のエラーが。
String index out of range: -1. Stacktrace follows:
java.lang.StringIndexOutOfBoundsException: String index out of range: -1
	at java.lang.AbstractStringBuilder.substring(AbstractStringBuilder.java:881)
	at java.lang.StringBuilder.substring(StringBuilder.java:55)
	at grails.converters.JSON.handleCircularRelationship(JSON.java:378)
	at grails.converters.JSON.value(JSON.java:191)
	at grails.converters.JSON.convertAnother(JSON.java:162)
	at grails.converters.JSON.value(JSON.java:199)
controllerとは別のファイルでクラスを定義すれば解決される。
広告
お問い合わせは sweng.tips@gmail.com まで。
inserted by FC2 system