トップ 差分 一覧 Farm ソース 検索 ヘルプ PDF RSS ログイン

Diary/2014-5-28

続・Playで遊んでみる

今日は,Play 2.xのScala Templatesでビュー&フォーム操作から.

Template

テンプレートからテンプレートもよべる,ということらしい.
も少し慣れが必要そうだなあ...

ユーザ入力フォームを作ってみる

modelsに追加したUserクラスがにageがあるのにサンプルではageの分がなくて
apply/unapplyがエラーになったので,"age"を追加してみた"-> text"じゃだめだったので,
"-> number"にしてみたけど,これって何だろう...

object UserController extends Controller{
  val userForm = Form(
		  mapping("name" -> text, "email" -> text, "age" -> number)
		  (User.apply) (User.unapply)
		  );
  def entryInit = Action {
	  val filledForm = userForm.fill(User("user name", "email address", 0))
			  Ok(views.html.user.entry(filledForm))
  }
  def entrySubmit = Action { implicit request =>
    val user = userForm.bindFromRequest.get
    println(user) 
    Ok(views.html.user.entrySubmit())
  }
}

entry.scala.htmlも

    <fieldset>
        <legend>input user info.</legend>
         @helper.inputText(userForm("name"))
         @helper.inputText(userForm("email"))
         @helper.inputText(userForm("age"))
    </fieldset>

のように変更.

バリデート

バリデート処理がかけるらしい.numberもバリデートなのだな.
Formsのところにバリデートはのってる
http://www.playframework.com/documentation/2.2.3/api/scala/index.html#play.api.data.Forms$
numberには最大値/最小値も指定できるようだ.

 val userForm = Form(
	  mapping("name" -> nonEmptyText, "email" -> email, "age" -> number(min=10, max=90))
	  (User.apply) (User.unapply)
	  );

としてみた.

 def entryInit = Action {
  val filledForm = userForm.fill(User("user name", "email address", 30))
		  Ok(views.html.user.entry(filledForm))
 }

デフォルト値のまま送信すると"email address"がメールアドレスとして不適切なのでエラーになって
デバッグ的な表示が.
アプリとしては,エラー処理が必要だよね.
と,思ったら直後にエラー処理の書き方が説明してあった.

 def entrySubmit = Action { implicit request =>
   userForm.bindFromRequest.fold(
     errors => {
       println("error!")
       BadRequest(views.html.user.entry(errors))
     },
     success => {
       println("entry success!")
       Ok(views.html.user.entrySubmit())
     })
 }

次は,データベースとの連携...らしいので,まずMySQLをインストール

ちなみに,なぜか xcodebuild が実行できないとかいうので,xcodebuild を単独で実行してみると

xcode-select: error: tool 'xcodebuild' requires Xcode, \
but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance

とエラーをはいていた.というわけで,

sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer

としてからMySQLをインストール.

sudo port install mysql56 +openssl +system_readline
sudo port install mysql56-server
sudo /opt/local/lib/mysql56/bin/mysql_install_db --user _mysql
sudo port load mysql56-server
sudo port select mysql mysql56

MySQLでDBを用意

まずは,ユーザを作る.

mysql -u root mysql

でMySQLにアクセスして

create user 'miyo'@'localhost' identified by PASSWORD

で,まあ,ローカルのマシンだし,ということで...

grant all on *.* to 'miyo'@'localhost';

とか.

show grants for miyo@localhost;

で確認.MySQLから切断して,

mysql -u miyo -p

で作成したmiyoでログイン.

create database play_test;

でデータベース作った.

show databases;

で,作ったデータベースを確認.

PlayにMySQLの設定をする

conf/application.confのdatabase関連のパラメタを設定

db.default.driver=com.mysql.jdbc.Driver
db.default.url="jdbc:mysql://localhost/play_test"
db.default.user=miyo
db.default.password=miyo
db.default.logStatements=true

projects/Build.scalaを設定...とあるけど,build.sbtに置き換えられたらしい.
mysqlを追加

libraryDependencies ++= Seq(
  "mysql" % "mysql-connector-java" % "5.1.30",
  jdbc,
  anorm,
  cache
)

playコンソールで

reload
update

とする.playコンソールで

run

としてWebブラウザから http://localhost:9000/sample1 にアクセスすると,
DBにアクセスできないというエラーが.
MySQLのskip-networkが有効になっているのが問題なようなので,
/opt/local/etc/mysql56/macports-default.cnfのskip-networkをコメントアウト.

sudo port unload mysql56-server
sudo port load mysql56-server

として,アクセスできた.よかった,よかった.

メモ

いつか使うかも - 高クオリティ!商用利用OKのアイコン、イラスト無料(フリー)素材まとめ