2016-11-05 8 views
1

今、私はplay2.2.1を使用していますが、私はJavaを知っていますが、Scalaについてはわかりません。 PlayFrameworkについて少しでも学習すれば、Scalaがフレームワークである程度使われていることがわかります。これは私の背景です。問題は、通過する値の数が複数ではないが、Tuple2が以下のコードで使用される理由です。PlayFrameworkでのタプルの役割

これは、コントローラのコードです:

//Action for making a message 
    public static Result add() { 
     Form<Message> f = new Form(Message.class); 
     List<Member> mems = Member.find.select("name").findList(); 
     List<Tuple2<String, String>> opts = 
          new ArrayList<Tuple2<String, String>>(); 
     for(Member mem: mems) { 
      opts.add(new Tuple2(mem.name, mem.name)); 
     } 
     return ok(add.render("fill-in form", f, opts)); 
    } 

これは、モデルのコードです:

@Entity 
public class Member extends Model { 

    @OneToMany(cascade = CascadeType.ALL) 
    public List<Message> messages = new ArrayList<Message>(); 

    @Id 
    public Long id; 

    @Required(message = "This item is Required") 
    public String name; 

    @Email(message = "Please Fill in a message") 
    public String mail; 

    public String tel; 

    public static Finder<Long, Member> find = new Finder<Long, Member>(Long.class, Member.class); 

    @Override 
    public String toString() { 
     String ids = "{id:"; 
     for (Message m: messages) { 
      ids += " " + m.id; 
     } 
     ids += "}"; 
     return ("[id:" + id + ", message:" + ids + ", name:" + name + ", mail:" + mail + ", tel:" + tel + "]"); 
    } 

    public static Member findByName(String input) { 
     return Member.find.where().eq("name", input).findList().get(0); 
    } 
} 

これは、ビューのコードです:再び

@(msg:String, form1: Form[models.Message], opts: List[Tuple2[String, String]]) 

@main("Sample page") { 
    <h1>ADD MESSAGE</h1> 
    <p>@msg</p> 
    @helper.form(action = routes.Application.create) { 

    @(helper.select (
     field = form1("name"), 
     options = opts 
     )) 

    @(helper.textarea (
     field = form1("message") 
     )) 

    <input type="submit"> 
    } 
} 

、なぜTuple2があり、どのコントローラーからビューに1つの値が渡されても2つの文字列値が含まれていますか? ここに示した情報が十分でない場合は、私にコメントをしてください。

+1

「ある程度」ではスカラを使用していません。 Play FrameworkはScalaで書かれており、主にScalaです。また、Java APIも備えています。 'key-value pairs'の最も自然な構造の一つに' tuple'があり、その 'list'は' key-value pairs'のリストのようです。 'opts.add(new Tuple2(mem.name、mem.name))'は、 'opts.add(new Tuple2(" name "、mem.name))' –

+0

であったはずです。私はあなたが言ったように変更しようとしました。それはうまくいく。だから、ここでタプルの最初の議論の意味は何ですか?あなたが示したコードは意味があり説得力があります。しかし、 "opts.add(新しいTuple2(mem.name、mem.name))"も大丈夫ですが、なぜですか?最初の議論は重要な意味を持ちませんか? –

+0

'new Tuple2(" abc "、" def ")'は、 'Tuple2 [String、String]'のインスタンスを作成します。 'Tuple'は' List'や 'Map'のような一般的な構造体です。 'Map [String、String]'を取る。 'Map [String、String]'はそれ自身の意味を持ちません。 'key'でマップされた' values'の所有者です。あなたはそのマップをどのように使用するのでしょうか? –

答えて

0

タプルの役割は、1つのインスタンスに複数の値を指定することです。おそらく名前のないクラスのようなものでしょうか?コメントを要約し、明確な例を与えるために、<select>構造の<option>タグの構造は

<option value="internal-value">shown-value</option> 

である私たちは、外部キー状況のため、多くの場合、それを使用する - 外部キーの値は、「内部値」であり、リンクされたテーブルの名前または他の属性が表示されます。

再生ヘルパー@selectを使用して生成する場合は、Seqのtuple2sを提供する必要があります。つまり、オプションごとに2つの文字列を指定します。最初の値は内部値、2番目の値は表示された値です。私はdefiningを使用していますが、これはそれを行う方法の1つに過ぎません。たとえば:あなたは、いくつかの特別なニーズやヘルパーを使用しない理由がある場合は、手動でそれを自分で生成することができます

@defining(for (a <- AppType.all()) yield (a.id.toString,a.name)) { appTypeList => 
    @select(
     apiForm("forApp"), 
     appTypeList, 
     'class -> "form-control", 
     '_default -> "-- None Selected --", 
     '_label -> "App Type" 
    ) 
} 

(またはあなた自身のヘルパーを書くことができます:))。例:

<select name="forApiType" id="forApiType"> 
    @ApiType.all().map { a => 
     <option value="@a.id" @if(a.id==apiType.id) {selected}> 
     @a.name 
     </option> 
    } 
</select> 
+0

あなたの説明では、私は外来キーのポイントを理解することはできません。もちろん、私は外来キーが何であるかを知っていますが、私は理解できません。補足情報を教えてください。あなたのコードでは、 "タプル"はないようです。だから私は混乱している。あなたは "タプル"を説明したので、コードを示しましたか? –

+0

'yield(a.id.toString、a.name)'は、@ selectヘルパーに必要な(String、String)型のTuple2のリストを生成します。外部キーの状況では、アドレステーブルのfk_country_id列にcountry_id(内部値)を格納するフォームに国名(表示値)のリストを表示するとします。それは説明するのに役立つのですか? (コードの2番目のセクションでは、タプルは使用しません)。 – wwkudu