Hatena::ブログ(Diary)

すにぺっと

2011-05-14

play-scalaを改めて学ぶ-12 yabeっぽいのつくる その1

| 21:03 | play-scalaを改めて学ぶ-12 yabeっぽいのつくる その1を含むブックマーク

play-scalaもだいたい基本的なところはやったので、

playのチュートリアルにもある、yabe(blogアプリ)っぽいアプリをつくってみる。

playのjava版は一通りやってみて、playの基本を押さえるのにすごく役に立った。

play-scalaも実際サイトでyabeを題材にチュートリアルをやってるけど、

それとは別に適度に端折りながらやる。


1.アプリ作成

$play new myblog --with=scala

playコマンドでアプリの雛形作成。

もちろんwith=scalaを忘れずに。

2.Eclipseで開発できるように

$play eclipsify myblog

ちなみに、

play ec アプリ

でも同じ意味。


3.DBを有効化

今回はMySQLを使用する。

いまのうちにインストールをしておくべし。

そして、

app/application.conf

を編集。

db=mysql:{ユーザー名}@{DB名}

mysqlの設定部分がコメントアウトされてるので、

それを解除する。

すぐあとでDBを作るのでユーザー名(パスワード)、

DB名を指定しておく。


4.DBスキーマを定義する

$mysql -u ユーザー名
>create database myblog

db/evolutionsディレクトリに1.sqlをという名前で作成。

evolution機能を使うので、このへんを見とくべし。

# myblog schema
 
# --- !Ups
 
CREATE TABLE User (
    id int(10) NOT NULL AUTO_INCREMENT,
    email varchar(100) NOT NULL,
    password varchar(50) NOT NULL,
    name varchar(50) NOT NULL,
    PRIMARY KEY (id)
);
 
# --- !Downs
 
DROP TABLE User; 

まずはユーザー用テーブルを作成。


5.eclipseにimport

eclipseをおもむろに起動し、importする。

ついでにeclipseディレクトリのmyblog.launchから起動。

localhost:9000にアクセスして次へ。


6.apply evolutions

アクセスすると、evolution機能によってDBを同期化しろみたいなことを言われるので、

Apply evolutionsボタンを押してテーブルを作成。


7.モデル作成(models.scala)

Anormを使用して、Userテーブルのモデルを作成する。

package models {

  import play.db.anorm.defaults._
  import play.db.anorm.Pk

  case class User(
    id: Pk[Int], name: String, password: String, email: String)

  object User extends Magic[User]
}

Magicで楽々DBアクセスをする。


8.テストクラス作成

モデルをつくったら単体テスト

testディレクトリデフォルトのテストがあるので、

中身をUserモデルのテストに変更。

import play._
import play.test._

import org.scalatest._
import org.scalatest.junit._
import org.scalatest.matchers._
import models.User
import play.db.anorm._

class BasicTests extends UnitFlatSpec with ShouldMatchers {

  it should "create and retrieve a User" in {

    User.create(User(NotAssigned, "syuta", "pass", "aaa@aaa.com"))

    val syuta = User.find("email={email}").on("email" -> "aaa@aaa.com").first()

    syuta should not be (None)
    syuta.get.name should be("syuta")

  }

}

Userの作成と検索を試してみる。

作成したら実行してみる。


9.テスト実行

eclipseディレクトリ

Test myblog.launchを起動してテスト実行。

さっきつくったテストは通るはず。


10.controller.scala修正

ユーザー用コントローラーを作成。

object UserController extends Controller {

  def index = {
    Logger.info("User#index")
    val users: Seq[User] = User.find().list()
    
    Template('users -> users)
  }

  def entry(user: User) = {
    Logger.info("User#entry")
    User.insert(user)

    index
  }

indexではユーザーを全件返す。

entryでも入力された情報で登録。


12.html作成

app/views/UserController/index.html

ユーザー登録用のHTMLを記述。

#{extends 'main.html' /} #{set title:'ユーザートップ' /}

<h1>create user!</h1>
<br />
<form action="@{UserController.entry()}" method="POST">
	name:<input type="text" name="user.name" /><br /> 
        password:<input type="text" name="user.password" /><br /> 
        email:<input type="text" name="user.email" /><br /> 
        <input type="submit" value="entry" />
</form>

<br/>
#{if users}
entry users.<br/>
<table border="1">
	<tr>
		<td>name</td>
		<td>password</td>
		<td>email</td>
	</tr>
	#{list items:users}
	<tr>
		<td>${_.name}</td>
		<td>${_.password}</td>
		<td>${_.email}</td>
	</tr>
	#{/list}

</table>
#{/if}

画面上部のフォームで登録。

下部のテーブルでは全件のユーザー情報を表示。


13.トップページと/userへのリンクつくる

controller.scalaにコントローラーを追加。

object CommonController extends Controller {

  def index = {
    Logger.info("Common#index")
    Template
  }

}

localhost:9000にアクセスしたときのトップページを作成。

ユーザー登録へのリンクを貼るだけ。

app/views/CommonController/index.html

#{extends 'main.html' /}
#{set title:'Home' /}


toppage.<br/>
<a href="/user">ユーザー登録</a>

最後にパスをconf/routesに追加。

#top page
GET     /                                      CommonController.index

# User page
GET     /user                                  UserController.index
POST    /user/entry                            UserController.entry

# Ignore favicon requests
GET     /favicon.ico                            404
# Map static resources from the /app/public folder to the /public path
GET     /public/                                staticDir:public
# Catch all
#*       /{controller}/{action}                  {controller}.{action}

これで起動し、localhost:9000にアクセス。

/userでユーザーを登録とリスト表示ができるようになった。

次はログインあたりを実装してみたりする。


プログラミングScala
プログラミングScala
posted with amazlet at 11.05.14
Dean Wampler Alex Payne
オライリージャパン
売り上げランキング: 200457

トラックバック - http://d.hatena.ne.jp/sy-2010/20110514/1305374602
リンク元
Connection: close