2011-09-14 11 views
4

ここに私のテストのセットアップ:どのようにプレイ中のオブジェクトのリストを提出するためのフレームワーク

モデル:

package models; 

    import javax.persistence.Entity; 
    import play.db.jpa.Model; 

    @Entity 
    public class Item extends Model { 

     public String propertyA; 
     public String propertyB; 

     public String getFullName() { 
      return this.propertyA + " - " + this.propertyB; 
     } 
    } 

コントローラー:

package controllers; 

import play.*; 
import play.mvc.*; 

import java.util.*; 

import models.*; 

public class Application extends Controller { 

    public static void index() { 
     List<Item> allItems = Item.findAll(); 
     render(allItems); 
    } 

    public static void save(List<Item> items) { 
     if (items == null) { 
      Logger.info("no items"); 
     } else { 
      for (Item item : items) { 
       Logger.info("item: %s",item); 
      } 
      Logger.info("-------"); 
     } 
     index(); 
    } 
} 

ビュー:

#{extends 'main.html' /} 
#{set title:'Home' /} 
#{form @Application.save()} 

Select Items: 
<div> 
    <select name="items" style="width: 200px;" multiple="multiple" size="10"> 
     #{list items:allItems, as: 'item'} 
     <option value=${item.id} >${item.fullName}</option> 
     #{/list} 
    </select> 
</div> 
<input type="submit" value="Save" /> 
#{/form} 

私は[選択]ボックスで2つの項目を選択すると、私は次のログ出力を得る:

06:22:20,560 INFO ~ ------- 
06:22:26,991 INFO ~ item: null 
06:22:26,991 INFO ~ item: null 

プレイがnullオブジェクトのリストに選択をマップするように見えます。私はビューを変更する場合でも:

<option value=${item} >${item.fullName}</option> 

私はnull値を取得します。

しかし、私はにコントローラを変更します。私は、少なくとも正しいIDのリストを取得

public static void save(List<Long> items) { 
... 
} 

どのようにしてこのアイテムを変更すれば、プレイによってアイテムに正しいマッピングが作成されるようにすることができますか?私はList<Long>の代わりにList<Item>を取得することを好む(ここで私は項目のリストをgehtするためにクエリを実行しなければならない)。

BR、ルネ

更新:

私が実行している場合:

curl -d "items[0].id=3&items[0].propertyA=bla&items[0].propertyB=blo&items[1].id=4" http://localhost:9000/application/save 

WICHは、上記のパラメータとPOSTを行い、私が手:

A02:39:53,072 INFO ~ item: bla - blo 
02:39:53,072 INFO ~ item: null - null 
02:39:53,072 INFO ~ ------- 

のようにこれは動作しますが、私はどのようにビューを変更することができないのか分かりません。私はそれが動作するようになったフェリペからの助けを借りて

:それは

アップデート2 :-(上記のパラメータをポストO。このコントローラーメソッドを追加する必要があります。

@Before(only = {"save"}) 
static void parseParams() { 
    String[] items = params.getAll("items"); 
    params.remove("items"); 
    for (int i = 0; i < items.length; i++) { 
     Item item = Item.findById(Long.parseLong(items[i])); 
     params.put("items[" + i + "].id", items[i]); 
     params.put("items[" + i + "].propertyA", item.propertyA); 
     params.put("items[" + i + "].propertyB", item.propertyB); 
    } 
} 
+0

@Beforeインターセプタでそれを行う方法があります...私は私の答えを更新します.. – Felipe

答えて

2

これはバインディングの問題です。再生は、受け取るlong []パラメーターをバインドしません。遊びのドキュメントから行く

http://www.playframework.org/documentation/1.2.3/controllers#objectbinding あなたは、プレイリストがitems[i].idとしてインデックスを持っていることを期待としてそれは、それが動作しないことが可能ですitems.id

にあなたの選択の名前を変更する必要があります...

これで問題が解決しない場合はカスタムバインドを作成できますが、多くの場所でこのバインドが必要になったときにそのオプションがうまくいきますあなたが投稿の最後に言ったように、質問をしない理由はありません。線に沿って

更新 何かを(あなたが失うか、それを自分で行うことによって、パフォーマンスを獲得していないのでプレイは、この結合を行うには、このクエリを行います):

@Before(only={"save"}) 
static void parseParams() { 
    String[] itens = params.getAll("items") 
    for (int i=0;i<itens.length;i++) { 
     params.put("items["+i+"].id",itens[i]) 
    } 
} 

が動作するはずです。

もう1つの方法はjavascriptですが、それは難しく、バグがより多く発生します。

+0

あなたにお返事ありがとうございます。 Plsは私の更新を見ている。 – reen

+0

これはうまくいきました。私は作業用のバージョンをUpdate 2に追加しました。 – reen

関連する問題