Revelでのmodel構築テスト-1

 FrameworkであるRevelを使って実際にmodelを作ってみます。Revelを立ち上げるのは色々な所に投稿されておりますのでそちらをご参照ください。また、以前に投稿したinterfaceの使い方もご参照ください。

**1. application作成**
　まずは適当な名前でアプリを作ります。今回はmyappにします。コマンドプロンプトで以下を実行します。ここまではいつも通りです。

```
$revel new myapp
```

**2.　models folder作成**
　次にmodelを入れるfolderを作成します。~go/src/myapp/app/の下にmodelsという名前でfolderを作成します。MVCに合わせるために私はmodelsにしました。

**3.　modelsの中身を実装する**
　modelsの中身を実装します。interfaceをうまく使ってpropertyはprivate設定にしmethod経由意外ではread/writeができないようにしています。またpublicなmethodとしてInitializerを実装しています。

```go:user.go
package models

import (
	"time"
)

type User interface {
	// setter
	SetUsername(username string)
	SetNickname(nickname string)
	SetEmail(email string)

	// getter
	GetUsername() (username string)
	GetNickname() (nickname string)
	GetEmail() (email string)
	GetUserID() (userID string)

	// public method
	CreateUserID()
}

type user struct {
	username string
	nickname string
	userID   string
	email    string
	update   time.Time
}
// The method for creating the user ID
func (user *user) CreateUserID() {
	user.update = time.Now()
	user.userID = user.username + "_" + user.update.String()
}

// Setter
func (user *user) SetUsername(username string) {
	user.username = username
}
func (user *user) SetNickname(nickname string) {
	user.nickname = nickname
}
func (user *user) SetEmail(email string) {
	user.email = email
}

// Getter
func (user *user) GetUsername() (username string) {
	return user.username
}
func (user *user) GetNickname() (nickname string) {
	return user.nickname
}
func (user *user) GetEmail() (email string) {
	return user.email
}
func (user *user) GetUserID() (userID string) {
	return user.userID
}

// User structure initializer
func InitUser() User {
	return new(user)
}
func InitUserWith(username string, nickname string, email string) User {
	return &user{username: username, nickname: nickname, email: email}
}
```

**4.　controlerの設定**
　modelが設計できたので次にcontrollerで読み出してみます。~go/src/myapp/app/の下にあるcontrollersのapp.goを変更していきます。2パターンのinitializerを実装したので実験してみます。

```go:app.go
package controllers

import (
	"fmt"
	"github.com/robfig/revel"
	"myapp/app/models"
)

type App struct {
	*revel.Controller
}

func (c App) Index() revel.Result {

	// Case-1
	user := models.InitUser()
	user.SetUsername("Cat")
	user.SetNickname("BlackCat")
	user.SetEmail("neko@email.com")
	user.CreateUserID()
	fmt.Println(
		"Username:", user.GetUsername(),
		"Nickname:", user.GetNickname(),
		"Email:", user.GetEmail(),
		"UserID:", user.GetUserID())

	// Case-2
	anotheruser := models.InitUserWith("Dog", "WhiteDog", "inu@email.com")
	anotheruser.CreateUserID()
	fmt.Println(
		"Username:", anotheruser.GetUsername(),
		"Nickname:", anotheruser.GetNickname(),
		"Email:", anotheruser.GetEmail(),
		"UserID:", anotheruser.GetUserID())

	return c.Render()
}
```
　私がはまったのは、modelsの読み込み方です。いろいろと試した結果一番短くmodelを読み込む方法は"myapp/app/models"でした。
 Case-1の場合は単純な場合で引数が不要なInitUser()を使いっています。その後Setxxx() methodを使って値を設定しています。Case-2は引数を使用した例です。どちらもやっていることは同じです。

**4.　結果確認**
　最後に実行して動作確認してみましょう。"$revel run myapp"を実行しlocalhost:9000にアクセスすると、コンパイルが始まり終了するとプロンプトにいかが出力されます。

```
Username: Cat Nickname: BlackCat Email: neko@email.com UserID: Cat_2014-04-19 22:17:34.213770737 +0900 JST
Username: Dog Nickname: WhiteDog Email: inu@email.com UserID: Dog_2014-04-19 22:17:34.213796161 +0900 JST
```
**5. 今後**
　挙動がある程度理解できたのでDBとの接続をしてみます。もちろん接続するのはmgoを使用してmongoDBに接続してみます。