rails5のapiモードを試した

はじめに

勉強もかねて簡単なapirailsで実装してみる。やりたいことは以下

・ローカルPCで動作させてみる
apiモード使ってjsonを返す
・dbからデータを取得する
・ページングに対応する

ローカルPCで動作させてみる

まずは rbenv を使って ruby環境でrailsをインストールするところまでやる。

http://kimagureneet.hatenablog.com/entry/2017/09/27/143151
基本的にはここに書いた通りだが
・今回はrails5を使いたいのでバージョンの固定はしない
apiモードを使いたいのでプロジェクト作成のコマンドに --api をつける

$ bundle exec rails new myapp --api
apiモードを使ってjsonを返す

とりあえずユーザの一覧を返すAPIを作ってみる。

routes に追加

Rails.application.routes.draw do
  get '/users', to: 'users#index'
end

routes の確認

$ ./bin/rails routes
Prefix Verb URI Pattern      Controller#Action
 users GET  /users(.:format) users#index

users コントローラの作成

$ ./bin/rails g controller users

controllers/users_controller.rb が作成されるのでjsonをかえすコードを追加

class UsersController < ApplicationController
  def index
    render json:{ users:[{id:1, name:'test1'},{id:2, name:'test2'}] }
  end
end

ここまで作ったら http://localhost:3000/users にアクセスすると json が返されることを確認できた。

{"users":[{"id":1,"name":"test1"},{"id":2,"name":"test2"}]}
dbからデータを取得する

まずはdbを作成

$ ./bin/rails db:create

つづいて model の作成

$ ./bin/rails g model user

model を作成するとmigrationファイルも作成されるのでここにカラムを追加する。
db/migrate/20171009182615_create_users.rb

class CreateUsers < ActiveRecord::Migration[5.1]
  def change
    create_table :users do |t|

      t.string :email
      t.string :name

      t.timestamps
    end
  end
end

migrate を実行

$ ./bin/rails db:migrate

ここまでにテーブルが作成されるのでコマンドラインからデータを登録して確認してみる

$ ./bin/rails console
# 登録
> user = User.new
> user.name = "test1"
> user.email = "test1@test.com"
> user.save

# 確認
> User.all

データが登録されたことを確認できたので、APIとしてもusersデータをかえすように修正
contorollers/users_controller.rb

class UsersController < ApplicationController
  def index
    render json:{ users:User.all }
  end
end
ページングに対応する

kaminari という gem が有名ぽいので使ってみる。

なにはともあれ kaminari をインストール

Gemfile

・・・
gem 'kaminari'                                                                                                                                                                                                     
・・・

以下でインストールと設定を行う

# インストール
$ bundle install

$ vi config/initializers/kaminari_config.rb
Kaminari.configure do |config|
  config.default_per_page = 2 ## デフォルト表示数を定義
・・・

controllers/users_controller.rb

class UsersController < ApplicationController
  def index
    users = User.all.page(params[:page])
    total = User.all.page.total_pages

    render json:{ total:total, users:users }
  end
end

http://localhost:3000/users

{"total":3, "users":[{"id":1,"name":"test1"},{"id":2,"name":"test2"}]}

http://localhost:3000/users?page=2

{"total":3, "users":[{"id":3,"name":"test3"}]}

とりあえずやりたいことはできた。以上です。