Go言語のWebフレームワークgin用ツールgin-scaffoldの使い方

# はじめに

Go言語のWebフレームワーク`gin`。
しかし、繰り返しのコードをいちいちめんどくさいことを書きたくないと思います。

https://github.com/dcu/gin-scaffold/

ドキュメントは英語、日本語、韓国語、中国語（簡体字）、ベトナム語があります。（2017/08現在）


## 日本語ドキュメント

https://github.com/dcu/gin-scaffold/blob/development/README.ja.md

## インストール方法

```
go get github.com/dcu/gin-scaffold
```

# プロジェクト生成

```
gin-scaffold init hoge
```

各操作をするときはプロジェクト内で行うのでフォルダ内に入っておきましょう。

```
cd hoge 
```

# DBの用意（MongoDB）

## インストール

Qiitaの記事のこちらがいいのでそこを参考に。（Mac）

[MongoDBのインストール](http://qiita.com/yoh-nak/items/f0c429f10347ae7ec98b)

## 起動

```
sudo mongod --dbpath /var/lib/mongodb --logpath /var/log/mongodb.log
```

## 一旦起動

hogeプロジェクトなので起動ファイルも`hoge.go`になってます。

```
go run hoge.go
```

`http://localhost:4000`にアクセスすれば見られます。


```hoge.go
func getPort() string {
        port := os.Getenv("PORT")
        if port == "" {
                port = "4000" // ここを変更
        }

        return port
}
```

## 表示

<img width="719" alt="Screen Shot 2017-08-13 at 10.12.14 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/11951/2295d059-50d1-43ec-15ff-c4ec8de3c42a.png">


Nothing to see here.が見えたら成功。

# スキャフォルディング

足場が作れます。(プロジェクトの中（今回は`hoge`フォルダ）で行うこと)

```
gin-scaffold scaffold モデル名 フィールド名:型名
```


**例**

```
gin-scaffold scaffold User name:int
```

`User`の`U`は大文字ですが、小文字でもいいようになってます。

## 各アクセス

```
[GIN-debug] POST   /users                    --> hoge/controllers.(*UsersController).(hoge/controllers.createUser)-fm (3 handlers)
[GIN-debug] GET    /users                    --> hoge/controllers.(*UsersController).(hoge/controllers.listUsers)-fm (3 handlers)
[GIN-debug] GET    /users/:user_id           --> hoge/controllers.(*UsersController).(hoge/controllers.getUser)-fm (3 handlers)
[GIN-debug] PUT    /users/:user_id           --> hoge/controllers.(*UsersController).(hoge/controllers.updateUser)-fm (3 handlers)
[GIN-debug] DELETE /users/:user_id           --> hoge/controllers.(*UsersController).(hoge/controllers.deleteUser)-fm (3 handlers)
[GIN-debug] GET    /                         --> main.main.func1 (3 handlers)
[GIN-debug] Listening and serving HTTP on :4000
```

とログが出るので直ぐにわかると思いますが、


なんどもscafoldのコマンドをするとうまく起動できず以下のエラーが出ると思います。

```
controllers/router.go:11: no new variables on left side of :=
```

`controllers/router.go`のSetupメソッドに同じコードが存在するときなので削除します。

```go:controllers/router.go
// Setup sets up all controllers.
func Setup(router *gin.Engine) {
        users := UsersController{Router: router}
        users.Setup()
        users := UsersController{Router: router} # ここ消す
        users.Setup() # ここ消す
}

// vi:syntax=go
```

### GET（User一覧の取得）

http://localhost:4000/users
へアクセスする。

### POST

テンプレートがないので`curl`コマンドで行うのがいいです。

```bash
curl -w '\n' 'http://localhost:4000/users' --data 'name=1234' -XPOST
```

### DELETE

```bash
curl -XDELETE 'http://localhost:4000/users/59b53b3ea75b064cedce7773'
```

idを指定します。ここでは、`59b53b3ea75b064cedce7773`がid。

### PUT

```
curl -XPUT 'http://localhost:4000/users/59b53b35a75b064cedce7772' -d 'name=天才'
```

これで指定。

×これはダメ。JSONも対応したいかな。

```
curl -XPUT 'http://localhost:4000/users/59b53b35a75b064cedce7772' -d '{
    "name" : "trying out Elasticsearch"
}'
```

更新したいもののidを指定。

※PUTはPOSTと違い、リソース名を指定して作成または更新をかけるメソッドです。

### id:1のUser取得

http://localhost:4000/users/1
へアクセスする。

# その他各操作

## モデル

```
gin-scaffold model モデル名 フィールド名:フィールドの型
```

## コントローラ生成

```
gin-scaffold controller コントローラ名
```

## 注意点

~~まだintとstring以外で生成すると怪しい。~~
~~私もCollaboratorなので修正する見込み。~~
対応しました。