vochicong/rails-json-api

View on GitHub
README.md

Summary

Maintainability
Test Coverage
[![Maintainability](https://api.codeclimate.com/v1/badges/6bc16f3bcc5522f2b685/maintainability)](https://codeclimate.com/github/vochicong/rails-json-api/maintainability)
[![Test Coverage](https://api.codeclimate.com/v1/badges/6bc16f3bcc5522f2b685/test_coverage)](https://codeclimate.com/github/vochicong/rails-json-api/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
```json
{
    "fullName": "Michal Jackson",
    "emailAddress": "michale@gmail.com"
}
```

#### Response

```json
{
    "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
```json
{
    "fullName": "Michale Jack",
    "emailAddress": "jack@gmail.com"
}
```

#### Response

```json
{
    "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 Hash#deep_transform_keys](http://api.rubyonrails.org/classes/Hash.html#method-i-deep_transform_keys-21)
- [Jbuilder](https://github.com/rails/jbuilder)
- [Postman](https://www.getpostman.com/)
- [DRY-ing The JSON Response](http://aalvarez.me/blog/posts/testing-a-rails-api-with-rspec.html)
- [Rails API Testing Best Practices](http://matthewlehner.net/rails-api-testing-guidelines/)

# Rails encrypted credentials

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

```ruby
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` からは探さない。

## 例

### 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