Play frameworkでisucon2アプリを書く-5

このエントリはPlay frameworkひとりアドベントカレンダーの20日目です。

今日は /ticket/ を実装します。

昨日までと同じ流れでいきましょう。

  1. 元コードを見てcontrollerのinput/outputとviewのinput/outputを確認
  2. modelを作る
  3. viewを作る
  4. controllerを作る(TODOでよい)
  5. 表示確認
  6. controllerを作りこむ

viewを仮実装する場合、注意点がひとつあります。
それは viewのファイルサイズに制限がある ということ。

元アプリで保存したHTMLをそのままticket.scala.htmlとして保存してアクセスすると、playのコンソールにこんなエラーが出ます。
このエラーが出た場合はviewのサイズが大きすぎるので、適当に削除してください。
※ブラウザ画面には、問題箇所とは違うerrorやwarningが表示されることがあるのでご注意!

[error] encoded string too long: 356738 bytes
@(ticket :Ticket, variations :List[HashMap[String, Any]], recent_solds:List[HashMap[String,String]])
(略)
<h2>@ticket.name</h2>
<ul>
@for(variationMap 
@defining(variationMap.get("vacancy").asInstanceOf[Integer]){ vacancy =&gt;
<li class="variation">
  <form method="POST" action="https://netmark.jp/buy">
    
    
    <span class="variation_name">@variation.name</span> 残り<span class="vacancy" id="vacancy_@variation.id">@vacancy</span>席
    
    
  </form>
</li>
}}
}
</ul>

<h3>席状況</h3>
@for(variationMap 
@defining(variationMap.get("vacancy").asInstanceOf[Integer]){ vacancy =&gt;
@defining(variationMap.get("stocks").asInstanceOf[List[Stock]]){ stocks =&gt;
<h4>@variation.name</h4>
<table class="seats">
@for(row &lt;- 0 to 63){
  <tr>
    @for(col   <td id="@stock.seatId"></td>  }
    }
  </tr>
  }
</table>
}}}
}
(略)

scala viewで変数定義は @defiing を、型変換は asInstanceOf を使いましょ。
その他にはとくにハマるところはないと思います。
昨日と同じノリでちくちくと実装しましょう。

12/20追記

ハマりポイントありました。

複合主キーをmodelで表現するには @UniqueConstraint アノテーションを使いましょう。
(まぁ別途定義してるからあんまり気にしなくてもいいんだけど)

package models;

import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;

import play.db.ebean.Model;

import com.avaje.ebean.annotation.UpdatedTimestamp;

@Entity
@Table(uniqueConstraints = { @UniqueConstraint(columnNames = { "variation_id",
		"seat_id" }) })
public class Stock extends Model {
	@Id
	public Integer id;

	public Long variationId;

	public String seatId;

	public Long orderId;

	@UpdatedTimestamp
	public Date updatedAt;

	public static Finder find = new Finder(
			Integer.class, Stock.class);
}

いよいよ明日は /buy します。


See also