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
Postman で叩いてみて、現段階の request と response の key を snake_case から camelCase に変えて API JSON format 仕様とする。
POST /users
{
"fullName": "Michal Jackson",
"emailAddress": "[email protected]"
}
{
"id": 3,
"fullName": "Michal Jackson",
"emailAddress": "[email protected]",
"createdAt": "2017-12-17T07:28:52.052Z",
"updatedAt": "2017-12-17T07:28:52.052Z",
"url": "http://localhost:3000/users/3.json"
}
PATCH/PUT /users/3
{
"fullName": "Michale Jack",
"emailAddress": "[email protected]"
}
{
"id": 3,
"fullName": "Michale Jack",
"emailAddress": "[email protected]",
"createdAt": "2017-12-17T07:28:52.052Z",
"updatedAt": "2017-12-17T07:33:53.010Z",
"url": "http://localhost:3000/users/3.json"
}
JSON APIのRSpecではJSON.parse(response.body)
がよく発生するため、
js_response
で済むヘルパーを導入してみました。
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": "[email protected]"}'
Get users
curl http://localhost:3000/users
- Rails Hash#deep_transform_keys
- Jbuilder
- Postman
- DRY-ing The JSON Response
- Rails API Testing Best Practices
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_CONFIG
は APP_CONFIG
をまず
環境変数 ENV
から探して、未設定の場合に encrypted credentials
から探す。
引数にデフォルトの値が与えられたら、encrypted credentials
からは探さない。
$ 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
$ RAILS_MASTER_KEY=289e1431050b365b62bb5917acabcc53 APP_CONFIG=envVar rails runner 'puts Env.APP_CONFIG("default")'
envVar
$ RAILS_MASTER_KEY=289e1431050b365b62bb5917acabcc53 rails runner 'puts Env.APP_CONFIG("default")'
default
$ RAILS_MASTER_KEY=289e1431050b365b62bb5917acabcc53 rails runner 'puts Env.APP_CONFIG'
encryptedConfig