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