Rails 初めてのAPI作成 1時間でとりあえず動くまで!!

RailsでAPIの作成を実施していきたいと思います。1時間程度でとりあえず動くところまでです!

<スポンサードリンク>

前提条件

前提条件として、Railsが動く環境が必要です。
参考までに今回の実行したRailsのバージョンは、下記の通りです。

% rails --version
Rails 5.1.6

そもそもAPIとは?

まず、APIについてです。APIは、

Application Programming Interface

の頭文字をとった言葉です。Interfaceとは、一般的に境界を示す言葉で、APIとは、なんらかのサービスを提供する事業者がそのサービスを使用したいユーザーに公開する、インターフェースのことです。

APIを公開する事業者は、この「URL」宛に、このリクエストを「この形式で」送ってくれれば、こんなデータを返すよ!といった情報を公開し、利用者は、その決まった方式に沿ってリクエストを出し、そのAPIを利用することになります。

APIの例としては、場所や郵便番号を指定し、お天気情報を取得することができるAPIがあります。
この記事「無料天気予報APIのOpenWeatherMapを使ってみる」を読んでみるとAPIの利用イメージもつきやすいと思います。

それでは、具体的にRailsを利用したAPIの作成方法について説明していきたいと思います。

RailsでAPIを作成!!

1. RailsプロジェクトをAPIモードで作成

通常のRailsプロジェクト作成とは違い、「–api」オプションを指定し、Rails のAPIを作成します。

このオプションによって、通常のRailsプロジェクトより、ミドルウェアをかなり絞った状態で、構成してくれます。
例えば、view関連や、ブラウザ系のライブラリなどを省いたアプリケーションを構成してくれます。

% rails new sample_api --api
$ cd sample_api

デフォルトだと、下記のようなディレクトリ構造になります。

% tree
.
├── Gemfile
├── Gemfile.lock
├── README.md
├── Rakefile
├── app
│   ├── channels
│   │   └── application_cable
│   │       ├── channel.rb
│   │       └── connection.rb
│   ├── controllers
│   │   ├── application_controller.rb
│   │   └── concerns
│   ├── jobs
│   │   └── application_job.rb
│   ├── mailers
│   │   └── application_mailer.rb
│   ├── models
│   │   ├── application_record.rb
│   │   └── concerns
│   └── views
│       └── layouts
│           ├── mailer.html.erb
│           └── mailer.text.erb
├── bin
│   ├── bundle
│   ├── rails
│   ├── rake
│   ├── setup
│   ├── spring
│   └── update
├── config
│   ├── application.rb
│   ├── boot.rb
│   ├── cable.yml
│   ├── database.yml
│   ├── environment.rb
│   ├── environments
│   │   ├── development.rb
│   │   ├── production.rb
│   │   └── test.rb
│   ├── initializers
│   │   ├── application_controller_renderer.rb
│   │   ├── backtrace_silencers.rb
│   │   ├── cors.rb
│   │   ├── filter_parameter_logging.rb
│   │   ├── inflections.rb
│   │   ├── mime_types.rb
│   │   └── wrap_parameters.rb
│   ├── locales
│   │   └── en.yml
│   ├── puma.rb
│   ├── routes.rb
│   ├── secrets.yml
│   └── spring.rb
├── config.ru
├── db
│   └── seeds.rb
├── lib
│   └── tasks
├── log
├── public
│   └── robots.txt
├── test
│   ├── controllers
│   ├── fixtures
│   │   └── files
│   ├── integration
│   ├── mailers
│   ├── models
│   └── test_helper.rb
├── tmp
│   └── cache
└── vendor

2. Rails APIの作成

今回は、手抜きですが、scaffoldでちゃちゃっと作っちゃいます。(Rails便利、、、、)

% rails g scaffold users name:string password:string address:string
      invoke  active_record
      create    db/migrate/20181104125527_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml
      invoke  resource_route
       route    resources :users
      invoke  scaffold_controller
      create    app/controllers/users_controller.rb
      invoke    test_unit
      create      test/controllers/users_controller_test.rb

scaffoldでgenerateすると上記のようなファイル群が作られます。
それでは、一番メインになるコントローラを見てみましょう。

既に色々なメソッドが用意されています。

% cat 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(:name, :password, :address)
    end
end

次にrake routesを実行してみましょう。config/routes.rbには

usersリソースを作成した際に、user用の設定がされており、rake routesを実行すると、userを操作するもろもろのルーティングの設定がされています。

r% 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

まだ、データベースの準備が整っていないので、migrateをしましょう。

% rake db:migrate 
== 20181104125527 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0018s
== 20181104125527 CreateUsers: migrated (0.0020s) =============================

これで、データベースの準備も整いました。

それでは、早速サーバーを立ち上げて、今作成したRails APIのテストをしてみましょう。

% rails s
=> Booting Puma
=> Rails 5.1.6 application starting in development 
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.12.0 (ruby 2.4.0-p0), 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

3. 作成したRails APIのテスト

これで、Railsを使ったAPIの実装(とりあえず動くとこまで。)が完了です。
Railsだとこんな感じで動くAPIを比較的簡単に実装することができるので、実装コストも安く作れるのが魅了です。

参考になれば幸いです。

関連

Ruby on Rails データベース構築設定まとめ

Railsの環境変数管理gem、dotenvの使い方徹底解説

Ruby on Rails 「config」gemで環境ごとに異なる定数をシンプルに管理する

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA