LoginSignup
4
3

More than 5 years have passed since last update.

Revelでのmodel構築テスト-1

Posted at

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を実装しています。

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を実装したので実験してみます。

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に接続してみます。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3