私はPlay!Framework 2.1.0を使用しています。以下が解決策です:
1. scala テンプレートでは、次のようにすべてのチェックボックス名を指定する必要があります。
@form(action = routes.Application.newPaper()) {
@inputText(paperForm("title"))
@******* Indexed chekbox name *********@
@for((t, index) <- topics.zipWithIndex) {
<input type="checkbox" name="topics[@index]" value="@t">@t <br>
}
<input type="submit" value="Create">
}
2.次に、コントローラーで、フォーム送信を処理するアクションとして、次のようなことを行う必要があります。
public static Result newPaper() {
// Bind submitted form value to your model, ex. Paper.java
Form<Paper> paperForm = Form.form(Paper.class).bindFromRequest();
Paper paper = paperForm.get();
Logger.info("Title entered = " + paper.title);
// Because in template we use indexed name, unchecked item are binded with null value
paper.topics.removeAll(Collections.singleton(null)); // remove value for unchecked topic
for (String t : paper.topics) {
Logger.info("The topic is " + t);
}
Logger.info("Total topic selected = " + paper.topics.size());
return redirect(routes.Application.index()); // redirect page
}
アップデート
これは、ソリューションの別のアイデアです。scala テンプレートのチェックボックス コードは変更されません。
@for(t <- topics) {
<input type='checkbox' name='topic' value=@t>@t <br>
}
したがって、コントローラーは次のようになります。
public static Result newPaper() {
// Bind submitted form value to your model, ex. Paper.java
Form<Paper> paperForm = Form.form(Paper.class).bindFromRequest();
Paper paper = paperForm.get();
// get request value from submitted form
Map<String, String[]> map = request().body().asFormUrlEncoded();
String[] checkedVal = map.get("topic"); // get selected topics
// assign checked value to model
paper.topics = Arrays.asList(checkedVal);
// for debugging purpose
for (String t : paper.topics) {
Logger.info("The topic is " + t);
}
Logger.info("Total topic selected = " + paper.topics.size());
return redirect(routes.Application.index()); // redirect page
}
このアイデアがよりエレガントであることを願っています.. :)
注: Play!Framework 2.1.1 でもテストしましたが、これで問題ありません。