このエントリは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 します。