Ruby on Rails 簡単なAPI作成(基礎)

#簡単なAPI作成
####今回実装する環境
Railsのバージョンは`$rails -v`コマンドで確認できます。
今回は Rails 5.2.3 の環境で実装します。
***
###1. APIモードのプロジェクト作成
APIモードでプロジェクトを作成する場合は、
プロジェクト製作コマンドに`--api`オプションを付与することで作成できます。

```console:console
$ rails new SampleAPI --api
```
エラーがなく終了したら終わりです。
***
###2. Model, Controller作成
次にModel, Controllerを作成します。
今回は面倒を省くため`Scaffold`を利用します。
Userのモデルにuser_id, name, title, textの項目を所持するように作成します。
`rails generate scaffold モデル名 項目1:タイプ 項目2:タイプ ・・・`で作成できます。

```console:console
$ cd SampleAPI
$ rails generate scaffold users user_id:integer name:string title:string text:text
```
<font color="green">create</font> ・・・
で終わっていれば問題ありません。
***
###3. マイグレーション
Controllerは以下のように作成されます。

```ruby:/app/controllers/users_controller.rb
class UsersController < ApplicationController
  before_action :set_user, only: [:show, :update, :destroy]

  # GET /users
  def index
    @users = User.all
    render json: @users
  end

  # GET /users/1
  def show
    render json: @user
  end

  # POST /users
  def create
    @user = User.new(user_params)

    if @user.save
      render json: @user, status: :created, location: @user
    else
      render json: @user.errors, status: :unprocessable_entity
    end
  end

  # PATCH/PUT /users/1
  def update
    if @user.update(user_params)
      render json: @user
    else
      render json: @user.errors, status: :unprocessable_entity
    end
  end

  # DELETE /users/1
  def destroy
    @user.destroy
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_user
      @user = User.find(params[:id])
    end

    # Only allow a trusted parameter "white list" through.
    def user_params
      params.require(:user).permit(:user_id, :name, :title, :string, :text)
    end
end
```
モデルは何も書いてない状態です。

```ruby:/app/models/user.rb
class User < ApplicationRecord
end
```
モデルが作成されたので、マイグレーションを行います。
"マイグレーション = データベースのアップデート作業" と考えてください。

```console:console
$ rails db:migrate
== 20190620183244 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0025s
== 20190620183244 CreateUsers: migrated (0.0026s) =============================
```
このような結果があれば問題ありません。
***
###4. 動作確認その1
では、サーバーを起動してみましょう。

```console:console
$ rails server
```
サーバーを起動したら、http:localhost:3000/usersにアクセスします。
この時点ではまだデータがない状態なので、白いページに`[ ]`のみ出力されていると思います。
データを保存することで`[ ]`の中にデータが入った状態で出力されます。
***
###5. データを保存
実際にデータをいれてみましょう。
####Restlet Client
今回はwebブラウザにGoogle Chromeを使います。
Google Chromeに[Restlet Client](https://chrome.google.com/webstore/detail/restlet-client-rest-api-t/aejoelaoggembcahagimdiliamlcdmfm?hl=ja)をインストールして使用します。
拡張機能で検索可能です。
Restlet Clientは視覚的にわかりやすいのでオススメです。
####APIのサーバ側にデータ送信&保存
まず`rake routes`を実行してください。

```concole:console
$ rake routes
rake aborted!
   ・・・
```
もし、rake abortedと表示されたらコマンドの先頭にbundle execを付け足してください。
表示されないの理想です。

```concole:concole
$ bundle exec rake routes
Prefix Verb   URI Pattern
Controller#Action
users GET    /users(.:format)           users#index
      POST   /users(.:format)           users#create
user  GET    /users/:id(.:format)       users#show
      PATCH  /users/:id(.:format)       users#update
      PUT    /users/:id(.:format)       users#update
      DELETE /users/:id(.:format)       users#destroy
                            ・・・
```
このような出力が得られます。
usersの項目のPOSTは
/usersのURLで usersのcreateアクションを呼ぶことがその行からわかります。
  => localhost:3000/usersにデータJSON形式でPOSTするとデータが作成(保存)される

では、実際にやってみましょう。
![ezgif-2-5809a0e54296.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259737/cdf731ee-9b5a-5d80-aaeb-23b5c361ddd5.gif)
このようにデータ作成が成功すれば適切にサーバが動いています。
***
###6. 動作確認その2
最後にwebブラウザなどで指定のURLにアクセスした時、JSON形式のデータが返されるかを確認します。
![ezgif-2-e9295659ad28.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259737/dcf99c0c-d3f4-5945-f2b4-4696f37d8c23.gif)
しっかりとデータがJSON形式で返されていることがみて取れます。
これでAPIの機能を持ったサーバができたと言えます。