経緯
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]
やること
- サンプルアプリを作成~起動
- モデル(User) & コントローラー作成(users_controller.rb)
- ルーティング(route.rb)編集
- users_controller.rbを編集
いざ実装
1. サンプルアプリを作成~起動
1-1. アプリ作成
# アプリ作成
$ rails new api_sample
# 作成されたアプリのルートへ
$ cd api_sample/
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とかが動いてるのかな。消し方とかわからんけど.....特に問題ないので無視。
2. モデル作成(User)
カラム | データ型 | 説明 |
---|---|---|
first_name | string | 名前 |
last_name | string | 苗字 |
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
わざと、URLを間違えてみると、設定済みのパスが表示されるので便利
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
まとめ
とりあえず、簡単にAPIのサンプルが作れました。
実際の仕事だと、パラメーター受け取って絞り込んだ結果を返す、みたいなことが多いかと思います。
今回は書けなかったですが、以下も色々調べたので、どこかで記事に出来たらなと思います。
- POSTで受け取ったパラメーター、paramsの.requireと.permitについて
- モデルにない項目を追加して、jsonで返却する方法
※2は、例えば、Userにbook_set_idとかを持ってて、responseに対象の本のタイトルの配列を返したい時とかとか。