Railsで超簡単API

#概要
RailsのAPIモードを利用してAPIを作成する手順をまとめました。
[作成するAPIへのリンク](https://github.com/K-Sato1995/MyApi)

#手順
1.　APIモードでRailsアプリの作成
2.　モデル・コントローラの作成
3.　名前空間を意識したルーティングの設定
4.　コントローラの設定
5.　[postman](https://www.getpostman.com/)を使用して動作の確認
6.　APIにテストを作成する

# APIモードでRailsアプリの作成
外部から`Post`というモデルの情報の作成・取得・削除・編集ができるような形式にします。
通常の`rails new`コマンドの末尾に`--api`をつけることでAPIモードでアプリを作成することができます。
(APIに必要ない部分をデフォルトで作成しなくなります。)

```console:console
$ rails new blog --api
```
#モデル・コントローラの作成
通常のRailsアプリ同様モデルとコントローラを作成します。
今回は`title`という`string`を持った`post`というテーブルを作成します。

```console
$ rails g model post title:string
$ rails g controller posts
$ rails db:create
$ rake db:migrate
```

#名前空間を意識したルーティングの設定
最初から以下の様にバージョンで名前空間を作成しておくことで今後のAPIのバージョン管理が容易になります。

```rb:config/routes.rb
Rails.application.routes.draw do
  namespace 'api' do
    namespace 'v1' do
      resources :posts
    end
  end
end
```
`rake routes`で確認すると以下の様になります。

```ruby
api_v1_posts GET    /api/v1/posts(.:format)     api/v1/posts#index
             POST   /api/v1/posts(.:format)     api/v1/posts#create
 api_v1_post GET    /api/v1/posts/:id(.:format) api/v1/posts#show
             PATCH  /api/v1/posts/:id(.:format) api/v1/posts#update
             PUT    /api/v1/posts/:id(.:format) api/v1/posts#update
             DELETE /api/v1/posts/:id(.:format) api/v1/posts#destroy
```

#コントローラの設定
ルートで設定した名前空間に合わせてディレクトリの構成は以下のようになります。

```
---- controllers

      --- api

        -- v1

         - posts_controller.rb
```
コントローラの中身を外部からajaxリクエスト等で情報の作成・取得・削除・編集が可能になるよう設定します。

```rb:posts.controller.rb
module Api
  module V1
    class PostsController < ApplicationController
      before_action :set_post, only: [:show, :update, :destroy]

      def index
        posts = Post.order(created_at: :desc)
        render json: { status: 'SUCCESS', message: 'Loaded posts', data: posts }
      end

      def show
        render json: { status: 'SUCCESS', message: 'Loaded the post', data: @post }
      end

      def create
        post = Post.new(post_params)
        if post.save
          render json: { status: 'SUCCESS', data: post }
        else
          render json: { status: 'ERROR', data: post.errors }
        end
      end

      def destroy
        @post.destroy
        render json: { status: 'SUCCESS', message: 'Deleted the post', data: @post }
      end

      def update
        if @post.update(post_params)
          render json: { status: 'SUCCESS', message: 'Updated the post', data: @post }
        else
          render json: { status: 'SUCCESS', message: 'Not updated', data: @post.errors }
        end
      end

      private

      def set_post
        @post = Post.find(params[:id])
      end

      def post_params
        params.require(:post).permit(:title)
      end
    end
  end
end
```

# [postman](https://www.getpostman.com/)を使用して動作の確認
まず`railsコンソール`を利用していくつかデータを作成しましょう。

```
$ rails c 
2.4.4 :001 > Post.create(title:'title1')
2.4.4 :001 > Post.create(title:'title2')
```

まず作成したAPIを動かします。

```console
$ rails s
```

```
# こちらでcsrfトークンエラーが起きたのでposts_controllerのコールバックに以下を追記しました
skip_before_action :verify_authenticity_token
```
次に[postman](https://www.getpostman.com/)を開き以下の動作の確認を行います。

### Get(http://localhost:3000/api/v1/posts)
先ほど登録した２つのデータを取得する事ができました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/258219/bd494dc7-7303-c48b-f0d5-a784331f1c50.png)

### GET(http://localhost:3000/api/v1/posts/:id)
今度は`id`で指定して必要なデータのみを取得します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/258219/0f35b92e-f51c-4bba-1db4-69ac07035b19.png)

### POST (http://localhost:3000/api/v1/posts)
次にデータを作成してみましょう。
`Post`リクエストなのでURLを入力する左側の選択肢を`Get`から`Post`に変更し、json形式のデータを渡します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/258219/0fb6d53a-f0f8-fdef-170e-3ca79d7457b7.png)

### PUT(http://localhost:3000/api/v1/posts/:id)
次は一度登録したデータを`Update(更新)`してみましょう。
URL左の選択肢を`PUT`に変更。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/258219/76d01d80-99ea-0980-2042-b52971dd2a05.png)

### DELETE(http://localhost:3000/api/v1/posts/:id)
最後に一度登録したデータを`Destroy(削除)`してみましょう。
URL左の選択肢を`DELETE`に変更。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/258219/d37392ff-eb77-14fc-17d1-86a42a9adcd6.png)

# APIにテストを作成する
APIを作成できたら動作を保証するためにテストを書いていきましょう。
APIのテスト作成方法については以下の記事にまとめました。

[【Rails】RailsAPIテストの書き方](https://qiita.com/k-penguin-sato/items/defdb828bd54729272ad)
#参考
[Rails による API 専用アプリ](https://railsguides.jp/api_app.html)