2012-04-18 6 views
5

フォーム提出から値のリストを受け取り、それをオブジェクトのリストにバインドすることが必死になっています。単一の行取得するためには何働くフォームからプレイフレームワーク2.0の複数のオブジェクトをバインドする

//class 
case class Task(name: String, description: String) 

val taskForm: Form[Task] = Form(
    mapping(
    "name" -> text, 
    "description" -> text 

)(Task.apply)(Task.unapply) 
) 


//form 
<tr> 
    <td><input name="name" type="text" class="span2" placeholder="Name..."></td> 
    <td><textarea name="description" class="autoexpand span7" rows="1"  placeholder="Description..."></textarea> 
    </td> 
</tr> 

//receiving action: 
val task = taskForm.bindFromRequest.get 

をしかし、今、私は、例えば、このようなタイプのタスクの複数のオブジェクトを提出したい:

taskForm.bindFromRequestを行う
<tr> 
    <td><input name="name[0]" type="text" class="span2" placeholder="Name..."></td> 
    <td><textarea name="description[0]" class="autoexpand span7" rows="1" placeholder="Description..."></textarea></td>     
</tr> 
<tr> 
    <td><input name="name[1]" type="text" class="span2" placeholder="Name..."></td> 
    <td><textarea name="description[1]" class="autoexpand span7" rows="1" placeholder="Description..."></textarea></td>     
</tr> 

。今すぐ を取得できません。

誰かがこれに対する解決策を考え出しましたか?あるいは、あなたはまったく違う状況に対処していますか?

答えて

17

私はドキュメントをもう一度見ようとしてくれてありがとう、私はすでにそれらを見たことがありますが、それをうまく組み合わせる方法は決してできませんでした。私はこれが、全部のスカラノブだからだと思う。 は、しかし、私は再びそれをいくつかの時間を与えた後の作業それを得た、これは私のソリューションです:タスクのリストを取得するために

val tasks = taskForm.bindFromRequest.get 

//classes 
case class Task(name: String, description: String) 
case class Tasks(tasks: List[Task]) 

val taskForm: Form[Tasks] = Form(
    mapping(
    "tasks" -> list(mapping(
    "name" -> text, 
    "description" -> text 
)(Task.apply)(Task.unapply)) 
)(Tasks.apply)(Tasks.unapply) 
) 

//form 
<tr> 
    <td><input name="tasks[0].name" type="text" class="span2" placeholder="Name..."></td> 
    <td><textarea name="tasks[0].description" class="autoexpand span7" rows="1" placeholder="Description..."></textarea></td>     
</tr> 
<tr> 
    <td><input name="tasks[1].name" type="text" class="span2" placeholder="Name..."></td> 
    <td><textarea name="tasks[1].description" class="autoexpand span7" rows="1" placeholder="Description..."></textarea></td>     
</tr> 

そして最後には、やります。

+0

あなたはそれを釘付けにした。それらを持っている私のために問題を持っていた人は、サブマップの周りに 'list()'をラップしていた – crockpotveggies

+1

しかし、どのように同じオブジェクト型のリストをバインドするのですか? (something:case class Person(name:String、friends:List [Person])?) – teo

+0

これは素晴らしいですが、Javaからこれを行うのはどうですか?最も基本的なJavaフレームワークはこれを簡単に実行します。これはショックではありません。 – Rob

1

playframeworkドキュメントpageから:

繰り返される値の形式のマッピングがまた繰り返される値を定義することができます

case class User(name: String, emails: List[String]) 

val userForm = Form(
    mapping(
    "name" -> text, 
    "emails" -> list(text) 
)(User.apply, User.unapply) 
) 

あなたは、このような繰り返しのデータを使用している場合 によって送信されるフォームの値は、ブラウザの名前をemails [0]、emails [1]、emails [2]などとする必要があります。

+0

下に投票していただけますか? – mericano1

関連する問題