このエントリはPlay frameworkひとりアドベントカレンダーの20日目です。
今日は /ticket/ を実装します。
昨日までと同じ流れでいきましょう。
- 元コードを見てcontrollerのinput/outputとviewのinput/outputを確認
- modelを作る
- viewを作る
- controllerを作る(TODOでよい)
- 表示確認
- 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 => <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 => @defining(variationMap.get("stocks").asInstanceOf[List[Stock]]){ stocks => <h4>@variation.name</h4> <table class="seats"> @for(row <- 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
します。