Rails::APIを使ってノンコーディングでAPIサーバーを作る


[Ruby on Railsを使ってノンコーディングでAPIサーバーを作る](http://qiita.com/ledsun/items/828ee69accb52bd01ac5)の[Rails::API](https://github.com/rails-api/rails-api)を使ったバリエーションです。

# 前提
- ページングを扱いません
- モデルの関連を扱いません
- Ubuntu 14.04
- Ruby 2.2.5
- Rails 4.2.6
- Rails::API 0.4.0
- MySQL 5.7

# 準備
OttoでRubyアプリケーション向けの環境を作りました。
ライブラリ類はだいたい入っている前提です。

アプリケーションを作る前は、MySQLで必要なライブラリが入らないので

```
sudo apt-get install libmysqlclient-dev
```

を実行します。

Ottoの環境の作り方は[ottoで構築する環境のubuntuのバージョンを上げる](http://qiita.com/ledsun/items/b3a97711300a15d2c850)を見てください。
今日の時点では割と高いハードルです。

# 手順

Railsを直接使うのと比べると

- config/application.rb編集
- protect_from_forgeryの無効化

が、なくなります。

## Rails::APIをインストール

```
gem install rails-api
```

## Railsアプリケーションを作成

```
rails-api new battle_beast -BJTS -d mysql
```

オプションで次の指定をします。

- bundle installを行わない
- javascriptを組み込まない
- test::unitを組み込まない
- sprocketsを組み込まない
- データベースの種類にmysqlを指定

## Gemfile編集
使わない

- spring

を消します。

```rb
source 'https://rubygems.org'

gem 'rails', '4.2.6'
gem 'rails-api'
gem 'mysql2'
```

## bundle install

```
bundle install --without staging production --jobs=4
```

## scaffold
```
bundle exec rails generate scaffold User name:string
```

## config/database.ymlを修正
```
username: root
password: root
host: mysql.service.consul
```

## DB作成

```
rake db:create
rake db:migrate
```

## 起動
rackupコマンドが入っていないので、railsコマンドから起動します。

```
bundle exec rails s -b 0.0.0.0 -p 9292
```

# 動作確認

IPアドレスはVirtualBox上の仮想環境のIPアドレスです。
各自の環境に合わせて、適当に読み替えてください。

## POST


```
curl -XPOST 'http://100.92.136.162:9292/users' -H content-type:application/json -d '{
  "user": {"name": "桂歌丸"}
}'
```

送信するデータにキーuserが必要です。

生成された`user_controller.rb`がStrong Parametersを使っています。

```rb
def user_params
  params.require(:user).permit(:name)
end
```


[» Rails4 の Strong Parameters でリクエストパラメータを検証する TECHSCORE BLOG](http://www.techscore.com/blog/2013/01/29/rails4-%E3%81%AE-strong-parameters-%E3%81%A7%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E6%A4%9C%E8%A8%BC%E3%81%99%E3%82%8B/)

> 「params.require(:user).permit(:name, :email)」となっています。
このコードは「params が :user というキーを持ち、params[:user] は :name 及び :email というキーを持つハッシュであること」を検証します。

## GET

```
curl 'http://100.92.136.162:9292/users'
```

レスポンスは

```
[{"id":1,"name":"桂歌丸","created_at":"2016-05-04T12:55:05.000Z","updated_at":"2016-05-04T12:55:05.000Z"}]
```

です。

## PUT
```
curl -XPUT 'http://100.92.136.162:9292/users/1' -H content-type:application/json -d '{
  "user": {"name": "イチロー"}
}'
```

## DELETE
```
curl -XDELETE 'http://100.92.136.162:9292/users/1'
```


# 感想
使い勝手は、Railsコマンドとほとんど変わりません。
設定手順が減る分、楽です。

jsonの形式が変わるのが、要件によっては気になるかもしれません。
特に設定なしでGETするURLがブラウザで開けます。便利です。
例外時のレスポンスがhtmlなのはイマイチでした。


# 参考
- [Rails API 使ってみた - Qiita](http://qiita.com/vgjuny/items/99fc54b4af884ba693cd)

- [» Rails4.2beta1をインストールして最初にはまったこと TECHSCORE BLOG](http://www.techscore.com/blog/2014/09/12/rails4-2beta1%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6%E6%9C%80%E5%88%9D%E3%81%AB%E3%81%AF%E3%81%BE%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8/)

- [» Rails4 の Strong Parameters でリクエストパラメータを検証する TECHSCORE BLOG](http://www.techscore.com/blog/2013/01/29/rails4-%E3%81%AE-strong-parameters-%E3%81%A7%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E6%A4%9C%E8%A8%BC%E3%81%99%E3%82%8B/)