tofucodes diary

にほんごのほう

Rails 5でAPIをさくっと作る方法

Rails 5のAPI専用モードでAPIのベースをさくっと作ってみたので備忘録として。

Rails開発環境の構築

Railsの最新バージョン(5.1.4)

$ gem install rails
...
12 gems installed

APIアプリケーション作成

$ rails new scribbles_api --api
...
RubyDep: WARNING: Your Ruby is outdated/buggy.
RubyDep: WARNING: Your Ruby is: 2.3.0 (buggy). Recommendation: upgrade to 2.3.1.

rubyのバージョンアップ

$ rbenv install 2.3.1
Downloading ruby-2.3.1.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.bz2
Installing ruby-2.3.1...

BUILD FAILED (OS X 10.12.6 using ruby-build 20160602)

Inspect or clean up the working tree at /var/folders/tz/_ldn35g52dl43l019mrzqfq00000gn/T/ruby-build.20171014151748.9497
Results logged to /var/folders/tz/_ldn35g52dl43l019mrzqfq00000gn/T/ruby-build.20171014151748.9497.log

Last 10 log lines:
  Referenced from: /private/var/folders/tz/_ldn35g52dl43l019mrzqfq00000gn/T/ruby-build.20171014151748.9497/ruby-2.3.1/./miniruby
  Expected in: /usr/lib/libSystem.B.dylib

dyld: Symbol not found: _utimensat
  Referenced from: /private/var/folders/tz/_ldn35g52dl43l019mrzqfq00000gn/T/ruby-build.20171014151748.9497/ruby-2.3.1/./minir
uby
  Expected in: /usr/lib/libSystem.B.dylib

make: *** [.rbconfig.time] Abort trap: 6
make: *** Waiting for unfinished jobs....
encdb.h updated

https://github.com/rvm/rvm/issues/3744
再度インストール

$ xcode-select --install

$ rbenv install 2.3.1
...
Installed ruby-2.3.1

$ rbenv local 2.3.1
$ rbenv rehash

$ gem install bundler
...
1 gem installed

$ bundle install
...
Bundle complete! 8 Gemfile dependencies, 49 gems now installed.

API作成

scaffoldでモデル・コントローラ作成

$ rails g scaffold User field1:type field2:type

ダミーデータ作成
以下の記事を参考にさせていただきました

Gemfile

# seeds
gem 'enumerize'
gem 'activerecord-import'
group :development, :test do
    gem 'faker'
    gem 'gimei'
end

lib/tasks/seed.rake

Pathname.glob(Rails.root.join('db/seeds/*.rb')) do |path|
    desc "Load the seed data from db/seeds/#{path.basename}."
    task "db:seed:#{path.basename(".*")}" => :environment do
        load(path)
    end
end

db/seeds/user.rb

# coding: utf-8

# Create dummy users
# Male
users = []
50.times do |no|
  gimei = Gimei.male
  users << User.new(
    user_hash: SecureRandom.uuid,
    nickname: gimei.katakana,
    email: Faker::Internet.email,
    password: Faker::Lorem.characters(45),
    gender: User.gender.male.value,
  )
end

# Female
50.times do |no|
  gimei = Gimei.female
  users << User.new(
    user_hash: SecureRandom.uuid,
    nickname: gimei.katakana,
    email: Faker::Internet.email,
    password: Faker::Lorem.characters(45),
    gender: User.gender.female.value,
  )
end

# Bulk insert
User.import users

ここまでやるとrakeのseedタスクがこんな感じ

rake -T db:seed
rake db:seed           # Loads the seed data from db/seeds.rb
rake db:seed:user      # Load the seed data from db/seeds/user.rb

あとは実際に実行してUserのダミーデータを作成

$ rake db:migrate
$ rake db:seed:user

rails routes確認

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

ローカルサーバ起動

$ rails server
=> Booting Puma
=> Rails 5.1.4 application starting in development
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.10.0 (ruby 2.3.1-p112), codename: Russell's Teapot
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000

curlで動作確認OK

$ curl "http://localhost:3000/users/1"
{"id":1,"user_hash":"3c929a28-3583-45a8-a71d-82295a2a6a3a","nickname":"タムラ コウタロウ","email":"vada@borerherman.com","password":"0pm8iatqkbk3n7x7vnxofwskk0aws5oyfvvj62r5y7nop","gender":"male","created_at":null,"updated_at":null}