[Rails] APIサーバーを立ててみる

## 経緯
Railsを使う機会が多いので、備忘も兼ねて、サンプルアプリを作って知識を定着させてしまおうという魂胆。

## 環境
```shell
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.14.2
BuildVersion:	18C54

$ rails -v
Rails 5.2.1.1

$ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin17]
```

## やること
1. サンプルアプリを作成~起動
2. モデル(User) & コントローラー作成(users_controller.rb)
3. ルーティング(route.rb)編集
4. users_controller.rbを編集

## いざ実装

### 1. サンプルアプリを作成~起動

#### 1-1. アプリ作成

```shell
# アプリ作成
$ rails new api_sample

# 作成されたアプリのルートへ
$ cd api_sample/
```
こんな感じのディレクトリが作られる。
![スクリーンショット.png](https://qiita-image-store.s3.amazonaws.com/0/117388/42e892ad-847a-5b61-454d-39b097bb2b5f.png)

#### 1-2. アプリ起動
```shell
$ rails s
=> Booting Puma
=> Rails 5.2.2 application starting in development
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.12.0 (ruby 2.3.1-p112), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
```

別作業でNuxt.js使ってるので、アイコンがそれなのは気にせず。無事に起動確認完了。
というか、これ、裏っ側でNode.jsとかが動いてるのかな。消し方とかわからんけど.....特に問題ないので無視。
<img width="1552" alt="スクリーンショット 2019-01-17 0.35.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/117388/4a6fe71f-8466-9af9-3dbe-82cdadd0d35a.png">

### 2. モデル作成(User)

| カラム            | データ型     |    説明             |
|:-----------------|------------:|:------------------:|
| first_name       |      string |      名前           |
| last_name        |      string |      苗字           |
| email            |      string |      メールアドレス  |
| age              |      string |      年齢          |
| created_at       |    datetime |      作成日時       |
| updated_at       |    datetime |      更新日時       |

#### 2-1. マイグレーションファイル作成
```shell
$ rails g migration createUsers
Running via Spring preloader in process 69312
      invoke  active_record
      create    db/migrate/20190116155033_create_users.rb
```

#### 2-2. マイグレーションファイル編集
```ruby
# 20190116155033_create_users.rb
class CreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      t.string :first_name
      t.string :last_name
      t.string :email
      t.integer :age
      t.timestamps
    end
  end
end
```

#### 2-3. マイグレーション実行
```shell
# マイグレーションファイルを反映
$ rails db:migrate
== 20190116155033 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0013s
== 20190116155033 CreateUsers: migrated (0.0014s) =============================

# コントローラー作成 -> ただ、これだと今回使わないファイルがたくさん作成されるので却下
$ rails g controller users_view_controller index
Running via Spring preloader in process 69407
      create  app/controllers/users_view_controller_controller.rb
       route  get 'users_view_controller/index'
      invoke  erb
      create    app/views/users_view_controller
      create    app/views/users_view_controller/index.html.erb
      invoke  test_unit
      create    test/controllers/users_view_controller_controller_test.rb
      invoke  helper
      create    app/helpers/users_view_controller_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/users_view_controller.coffee
      invoke    scss
      create      app/assets/stylesheets/users_view_controller.scss
```

#### 2-4. 各種ファイル編集

以下ファイルを新規作成

- app/controllers/users_controller.rb
- app/views/users/index.html.erb
- app/models/user.rb

**users_controller.rb**

```rb
class UsersController < ApplicationController
  def index
  end
end
```
**user.rb**

```rb
class User < ApplicationRecord
end
```

**index.html.erb**

```erb
<p>sample page!</p>
```

### 3. ルーティング(route.rb)編集

**route.rb**

```rb
Rails.application.routes.draw do
  resources :users, only: [:index]
end
```
サーバーを起動してみて、新しい画面を確認
<img width="1552" alt="スクリーンショット 2019-01-17 1.17.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/117388/2a417c77-6c91-bbfd-915b-840d497af419.png">

わざと、URLを間違えてみると、設定済みのパスが表示されるので便利
<img width="1552" alt="スクリーンショット 2019-01-17 1.20.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/117388/ebb7464d-94bb-0b04-0260-9d41fdb21607.png">

### 4. users_controller.rbを編集
先ほどは、users_controller.rbのindexに何も記載していなかったので、views/users/index.html.erbがレンダリングされて新しい画面が表示されていたのだが。今回はAPIの検証なので、http://localhost:3000/users にアクセスした時に、jsonを返却するようにする。

**users_controller.rb**

```rb
class UsersController < ApplicationController
  def index
    @users = User.all
    render json: @users
  end
end
```
これだとデータがないので、何も表示されないので、データを追加する

```shell
$ rails c
```

```irb
irb(main):001:0> User.create(
irb(main):002:1*   [
irb(main):003:2*       {first_name: '秀喜', last_name: '松井', email: 'hideki@sample.com', age: 44},
irb(main):004:2*       {first_name: '佳浩', last_name: '丸', email: 'maru@sample.com', age: 29},
irb(main):005:2*       {first_name: '雅之', last_name: '掛布', email: 'masayuki@sample.com', age: 63}
irb(main):006:2>   ]
irb(main):007:1> )
   (0.1ms)  begin transaction
  User Create (0.4ms)  INSERT INTO "users" ("first_name", "last_name", "email", "age", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?)  [["first_name", "秀喜"], ["last_name", "松井"], ["email", "hideki@sample.com"], ["age", 44], ["created_at", "2019-01-16 16:47:41.227425"], ["updated_at", "2019-01-16 16:47:41.227425"]]
   (0.6ms)  commit transaction
   (0.0ms)  begin transaction
  User Create (0.3ms)  INSERT INTO "users" ("first_name", "last_name", "email", "age", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?)  [["first_name", "佳浩"], ["last_name", "丸"], ["email", "maru@sample.com"], ["age", 29], ["created_at", "2019-01-16 16:47:41.235243"], ["updated_at", "2019-01-16 16:47:41.235243"]]
   (0.6ms)  commit transaction
   (0.0ms)  begin transaction
  User Create (0.3ms)  INSERT INTO "users" ("first_name", "last_name", "email", "age", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?)  [["first_name", "雅之"], ["last_name", "掛布"], ["email", "masayuki@sample.com"], ["age", 63], ["created_at", "2019-01-16 16:47:41.237334"], ["updated_at", "2019-01-16 16:47:41.237334"]]
   (0.6ms)  commit transaction
=> [#<User id: 1, first_name: "秀喜", last_name: "松井", email: "hideki@sample.com", age: 44, created_at: "2019-01-16 16:47:41", updated_at: "2019-01-16 16:47:41">, #<User id: 2, first_name: "佳浩", last_name: "丸", email: "maru@sample.com", age: 29, created_at: "2019-01-16 16:47:41", updated_at: "2019-01-16 16:47:41">, #<User id: 3, first_name: "雅之", last_name: "掛布", email: "masayuki@sample.com", age: 63, created_at: "2019-01-16 16:47:41", updated_at: "2019-01-16 16:47:41">]

irb(main):008:0> quit
```

接続してみる
<img width="1552" alt="スクリーンショット 2019-01-17 1.49.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/117388/3d40b6e6-7093-68e4-4d76-b4061bc9f23a.png">

## まとめ
とりあえず、簡単にAPIのサンプルが作れました。
実際の仕事だと、パラメーター受け取って絞り込んだ結果を返す、みたいなことが多いかと思います。
今回は書けなかったですが、以下も色々調べたので、どこかで記事に出来たらなと思います。

1. POSTで受け取ったパラメーター、paramsの.requireと.permitについて
2. モデルにない項目を追加して、jsonで返却する方法 

※2は、例えば、Userにbook_set_idとかを持ってて、responseに対象の本のタイトルの配列を返したい時とかとか。