Skip to content

a working example of Rails providing camelCase JSON API service

Notifications You must be signed in to change notification settings

vochicong/rails-json-api

Repository files navigation

Maintainability Test Coverage

Rails API server

作業手順

Rails APIアプリを新規作成

rails new rails_api --api

User を scaffold

rails generate scaffold User full_name:string email_address:string

JSON API では key として camelCase (fullName や emailAddress)を使う想定。

rails cで User のデータを追加。

簡単に動いているかどうかを見る

rails s
open http://localhost:3000/users.json
open http://localhost:3000/users/1.json

Post を scaffold

rails generate scaffold post post_content:text user_id:integer

rails cで Post のデータを追加。

TODO: seeds で User と Post のテストデータを作成・保存

簡単に動いているかどうかを見る

rails s
open http://localhost:3000/posts.json
open http://localhost:3000/posts/1.json

RSpec のインストール(初期設定)

rails generate rspec:install

API JSON format

Postman で叩いてみて、現段階の request と response の key を snake_case から camelCase に変えて API JSON format 仕様とする。

Create

Request

POST /users

{
    "fullName": "Michal Jackson",
    "emailAddress": "michale@gmail.com"
}

Response

{
    "id": 3,
    "fullName": "Michal Jackson",
    "emailAddress": "michale@gmail.com",
    "createdAt": "2017-12-17T07:28:52.052Z",
    "updatedAt": "2017-12-17T07:28:52.052Z",
    "url": "http://localhost:3000/users/3.json"
}

Update

Request

PATCH/PUT /users/3

{
    "fullName": "Michale Jack",
    "emailAddress": "jack@gmail.com"
}

Response

{
    "id": 3,
    "fullName": "Michale Jack",
    "emailAddress": "jack@gmail.com",
    "createdAt": "2017-12-17T07:28:52.052Z",
    "updatedAt": "2017-12-17T07:33:53.010Z",
    "url": "http://localhost:3000/users/3.json"
}

API JSON testing

JSON APIのRSpecではJSON.parse(response.body)がよく発生するため、 js_responseで済むヘルパーを導入してみました。

Manual testing

Start Rails server

bin/rails db:migrate RAILS_ENV=development
rails s

Create users

curl http://localhost:3000/users -X POST -H "Content-Type: application/json" -d '{"fullName": "Michal Jackson", "emailAddress": "michale@gmail.com"}'

Get users

curl http://localhost:3000/users

参考

Rails encrypted credentials

Rails 5.2 から config/credentials.yml.enc が導入され、混乱を招いている。 development, test では環境変数を使って、production (または stagingなど)で encrypted credentials を使うニーズに手軽に対応するには、 config/environment.rb にクラス Envを導入してみた。

class Env
  def self.method_missing(name, *default)
    ENV[name.to_s] ||
      default.first ||
      Rails.application.credentials.send(name) ||
      super
  end

  def self.respond_to_missing?(*)
    true
  end
end

使い方

システム構成情報は、環境変数またはconfig/credentials.yml.encに設定する。 Env.APP_CONFIGAPP_CONFIG をまず 環境変数 ENV から探して、未設定の場合に encrypted credentials から探す。 引数にデフォルトの値が与えられたら、encrypted credentials からは探さない。

config/credentials.yml.enc の内容確認

$ RAILS_MASTER_KEY=289e1431050b365b62bb5917acabcc53 rails credentials:show
secret_key_base: 2105bc31227a27f81b901582a8bb43b35bebea2b9c3572b024184a0b06dad26fc3bb312fbc5a7069783798d22f55cf4f411ae19169dd2a78026dccfbbdc889d7
APP_CONFIG: encryptedConfig

環境変数が未定義の場合、デフォルト値が使われる

$ rails runner 'puts Env.APP_CONFIG("default")'
default

環境変数がデフォルト値よりも優先される

$ APP_CONFIG=envVar rails runner 'puts Env.APP_CONFIG("default")'
envVar

環境変数が、encrypted credentials よりも優先される

$ RAILS_MASTER_KEY=289e1431050b365b62bb5917acabcc53 APP_CONFIG=envVar rails runner 'puts Env.APP_CONFIG("default")'
envVar

デフォルト値が encrypted credentials よりも優先される

$ RAILS_MASTER_KEY=289e1431050b365b62bb5917acabcc53 rails runner 'puts Env.APP_CONFIG("default")'
default

環境変数もデフォルト値も未定義の場合、encrypted credentials が使われる

$ RAILS_MASTER_KEY=289e1431050b365b62bb5917acabcc53 rails runner 'puts Env.APP_CONFIG'
encryptedConfig

About

a working example of Rails providing camelCase JSON API service

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published