LoginSignup
6
12

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-01-16

経緯

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

環境

$ 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. アプリ作成

# アプリ作成
$ rails new api_sample

# 作成されたアプリのルートへ
$ cd api_sample/

こんな感じのディレクトリが作られる。
スクリーンショット.png

1-2. アプリ起動

$ 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とかが動いてるのかな。消し方とかわからんけど.....特に問題ないので無視。
スクリーンショット 2019-01-17 0.35.36.png

2. モデル作成(User)

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

2-1. マイグレーションファイル作成

$ rails g migration createUsers
Running via Spring preloader in process 69312
      invoke  active_record
      create    db/migrate/20190116155033_create_users.rb

2-2. マイグレーションファイル編集

# 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. マイグレーション実行

# マイグレーションファイルを反映
$ 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

class UsersController < ApplicationController
  def index
  end
end

user.rb

class User < ApplicationRecord
end

index.html.erb

<p>sample page!</p>

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

route.rb

Rails.application.routes.draw do
  resources :users, only: [:index]
end

サーバーを起動してみて、新しい画面を確認
スクリーンショット 2019-01-17 1.17.32.png

わざと、URLを間違えてみると、設定済みのパスが表示されるので便利
スクリーンショット 2019-01-17 1.20.07.png

4. users_controller.rbを編集

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

users_controller.rb

class UsersController < ApplicationController
  def index
    @users = User.all
    render json: @users
  end
end

これだとデータがないので、何も表示されないので、データを追加する

$ rails c
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

接続してみる
スクリーンショット 2019-01-17 1.49.51.png

まとめ

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

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

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

6
12
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
12