2012年12月18日火曜日

Play! ~チュートリアルをやってみた後編

前回からのさらに続き. いい加減終わりたい(;ω;`)

7. Taskフォームの作成

今回はTaskクラスなのでTaskフォーム. UserクラスならUserフォーム. まんまですね(・ω・`)
イメージは中身のクラスを運ぶコンテナ的な何か.
準備としてはTaskクラスの方に
import play.data.*
が必要とのこと. しかし例ではいきなり必要な部分だけimportしてるし('A`)
準備ができたら今度はコントローラの方に,
 Form<Task> taskForm = form(Task.class);
を宣言. これにより, ビューとコントローラの間でのデータのやり取りができるほか, 制約を簡単に加えることができる.
制約に関しては, 例えばTaskでは必須入力項目としてタスクのラベルに制約をかけたいなら, Taskクラスの方で
@Required
public String label;
としてやるだけで, やれデータが入っているかー, なんてif文とか書かなくて済むのである.

8. トップページ描画

Taskフォームを用いて実際にページを見てみる. Application.java のtasks()の戻り値を,
return ok(views.html.index.render(Task.all(), taskForm));
Task.all()はstaticな関数, Taskのリストを返す. これとFormを投げて準備完了.
これでここまできちんとコピペしてきていたら, 適当にブラウザを立ち上げ 「localhost:9000」で見られるはず. (ちゃんと play run していれば)
ただしこの時点ではTaskのCreate機能を積んでいないので, 次の項目で作る.

9. Createボタンの実装

もう訳とかどうでもよくnこの項目でタスクの新規作成処理を積み込む.
Application.javaのnewTask(), この内容を作成する.
public static Result newTask() {
  Form<Task> filledForm = taskForm.bindFromRequest();
  if(filledForm.hasErrors()) {
    return badRequest(views.html.index.render(Task.all(), filledForm));
  } else {
    Task.create(filledForm.get());
    return redirect(routes.Application.task());
  }
}
さらっと書かれていてコピペしてスルーしてしまいそうなところだが, 実はイロイロ大事な部分が含まれているという罠. チュートリアル汚い.

2行目 bindFromRequest() これはリクエストからFormを取り出すメソッド. これをしないといつまでもこのクラスの最初に作成した空のtaskFormを参照してしまい, なにも表示されないことに折れるまで首を傾げるハメになる. もちろんリクエストが無いときは取れません.

3行目 filledForm.hasErrors() 2行目で取得したものにエラーが無いかチェックするメソッド. エラーがあったらtrueが返り, 4行目のようにバッドリクエストを返すようにする大事な処理.

6行目 filledForm.get() これでFormの中に含まれるTaskを取り出す. Formのまま投げないように. この6行目でTaskクラスから新規タスクを作成する.


10. データベースによるTaskの保存

正直わかんないorz なんでいきなりH2DBが絡んでくるのよ…('A`) 前に使ってH2DBの準備してたからいいけど, これ準備無かったらどうなるんだろう…
超簡単に.
conf/application.conf, ここまでずっと横をスルーされてきたこいつをいじる. 中身はいろいろ必要なことが書かれているので下手にいじると爆死します. "#" がその行のコメントアウト. チュートリアルではaddと言っているが, 既に書かれた上でコメントアウトされているので, 混乱を避けるためにも#を外して対処しましょう. ちなみにその下にパスワード設定なんかもありますがいじって無いので省略.  このちょっと下に次の設定もコメントアウトされているのでこちらも対処.
その後Taskクラスをチュートリアルのように書き換えると, 見事タスクが増えるようになりました.
うん, よくわからんorz.

11. タスクの削除

これ逆に章分ける必要あるのか?
DBへの接続の設定は済んでいるので, 削除部分をApplication.javaへ書き込む.
以上.


デプロイはやっていないので今回は省略. なのでここで終了.
こっちを見るとより詳しく見ることができる.





最後グダグダだぁ…('A`)



0 件のコメント:

コメントを投稿

AWS CDKで立てたEC2インスタンスのTimeZoneとかいじりたかった話

EC2を立てることはできたけど、立てたインスタンスは UTCのままだし設定ファイルとかいちいちscpしてくるのはダルい。 当初UserDataでなんとかしようとしたものの、「書く量がヤバいしメンテしにくい」と悩んでいたところ見かけたのが  AWS::CloudFormation:...