PlayFrameworkのtemplate

今日はPlayのテンプレートで3つ発見があったので、そのときのことをメモします。
ソースが手元にないので覚えてる部分から書いていきます。

・別のテンプレートをページの一部に読み込む(Railsのpartialみたいな)
・ループの中でインデックスを取得する
・フォームから複数のオブジェクトをListとしてコントローラーで受け取る

別のテンプレートを読み込むには、親になるテンプレートでincludeを使います。
今回やったのはこんな感じです。
1.EditAll画面でBookオブジェクトのListを受け取る。
2.BookのListをループさせて、includeしたBookオブジェクトの詳細を表示するbook.htmlで表示

/*editAll.html*/
#{form @Book.saveAll() , id:'saveAllForm'}
  #{list items:books, as:'book'}
    #{include 'book.html' /}
  #{/list}
<input type="submit" value="Save All" />
#{/form}
/*book.html*/
<input type="text" name="books[${book_index}].name" value="${book.name}" />
<input type="text" name="books[${book_index}].price" value="${book.price}" />

includeだと親のテンプレートで使える変数はすべてそのまま使えます。
book.htmlはループの中でincludeされているので「オブジェクト名_index」でインデックスを取得できます。
他にも、Listの最後のアイテムかどうか、最初のアイテムかどうかを判断するbook_isLastとbook_isFirstが使えます。

SubmitされたあとはController上のActionで、引数にListで指定するだけで使えます。

public static void saveAll(List<Book> books){
...
}

Source:
http://www.playframework.org/documentation/1.2.3/tags#list
http://stackoverflow.com/questions/7659310/play-framework-how-can-i-pass-collection-to-action-create