【Rails 5】APIまわりのPull Requestを追いかけてみる

# Rails API
[rails/rails][rails]のPull Requestに[**Rails api**][pr-api]というものがありました．
[rails-api][rails-api]の要素をRalis本体に取り込んだものになるようです．

いまのところ，RailsでAPIサーバ作るための超絶スーパーかっこいい便利機能が追加されるというよりは，既存のRailsだとAPIサーバ用途にはデカすぎるのでいいカンジにコンパクトにしていくという方向性っぽいです．

以下，Pull Request内のコミットから気になったやつを適当にピックアップしてみます．

（本記事は2015/4/29 日本時間午前9時時点での情報です．今後，開発が進むことで情報が古くなることが予想されます．）

## [Add ActionController API functionality · spastorino/rails@a8559ef](https://github.com/spastorino/rails/commit/a8559ef08c96e076506d6bfaf5ba1777481d6266)

`ActionController::Api`というクラスが新たに提供されるようです．
『[Railsアプリつくった - ✘╹◡╹✘][r7kamura-20140406]』で触れられていたものと同じアプローチで，`ActionCntroller::Base`の代わりに`Metal`を継承したものを新たに作成することにより軽量化を図っているようです．

>  API Controller is a lightweight version of <tt>ActionController::Base</tt>, created for applications that don't require all functionality that a complete \Rails controller provides, allowing you to create faster controllers for example for API only applications.


[ActionController::Base](https://github.com/rails/rails/blob/a882c69e7b0e5c41b2fea20f0c337107f6203b47/actionpack/lib/action_controller/base.rb#L203-L247)と[ActionController::Api](https://github.com/spastorino/rails/blob/rails-api/actionpack/lib/action_controller/api.rb#L125-L149)でincludeされてるModule数を見比べてみると結構減ってるのがわかります．


## [rails new --api generates an api app skeleton · spastorino/rails@9432f85](https://github.com/spastorino/rails/commit/9432f85400c22f466512385f753e83562ae72f85)
`rails new --api <app_name>`のように`rails new`時に`--api`というオプションをつけることで，API実装に関して不要なものを取り除いたアプリのスケルトンを生成してくれるようです．

* `ApplicationController`のスーパークラスが`ActiveController::Api`になる
* `app/{asset,helper,view}s`が生成されない


## [api option implies skipping javascript & sprockets · spastorino/rails@8125c47](https://github.com/spastorino/rails/commit/8125c47018be20fdceddac7bbe61c8f883517dd1)
`--api`オプションにより，**sprocketsまわりのgemが省略**されるみたいです（`sass-rails`，`coffee-ralis`，etc.）．
API用のアプリになるんだから当たり前っちゃ当たり前ですが…
フロントはRailsから完全に切り離されることになるので，gulpもtypescriptもbrowserifyもbabelも使いたい放題です．やったね．

## [config.generators.api_only = true set rails api option on generators · spastorino/rails@2f93977](https://github.com/spastorino/rails/commit/2f939778b0fce6e91a25ccaf08069b3d5ac4c152)

`config.api_only`を設定することで，scaffolding時に生成されるものがAPIアプリ仕様になるようです（最初は`config.generators.api_only`だったけど[途中で変わった](https://github.com/spastorino/rails/commit/652f77e1fd22bf6aa3bbb602ee48d346ef880bc0)）．
[生成されるcontroller](https://github.com/spastorino/rails/commit/c9bdf793940f9f4c45dc1c44eef9aff9fa8eb480)がjsonを返すものになってたり，`{asset,helper,view}s`が生成されなかったり…．


## [Disable jbuilder for Rails API apps, meanwhile it doesn't play nicely · spastorino/rails@b324328](https://github.com/spastorino/rails/commit/b324328902d226c3139290cfbb4a7b2a3b8a65a2)

APIなRailsではjbuliderが外されるみたいです．
[generators/rails/scaffold_controller/templates/api_controller.rb#L10-L14](https://github.com/spastorino/rails/blob/c9bdf793940f9f4c45dc1c44eef9aff9fa8eb480/railties/lib/rails/generators/rails/scaffold_controller/templates/api_controller.rb#L10-L14)を見た感じだと普通にrender jsonしてますね．

```ruby
# generators/rails/scaffold_controller/templates/api_controller.rb#L10-L14
def index
  @<%= plural_table_name %> = <%= orm_class.all(class_name) %>
  render json: <%= "@#{plural_table_name}" %>
end
```

議論を眺めていると，jbuilder派と[AMS（ActiveModel::Serializer）](https://github.com/rails-api/active_model_serializers)派がいておもしろいです．
どうでもいいですが，僕は[cookpad/garage](https://github.com/cookpad/garage)や[ROAR](https://github.com/apotonick/roar)のようなRepresenterが好みです．


# References

* [Rails api by dhh · Pull Request #19832 · rails/rails][pr-api]
* [rails-api/rails-api](rails-api)
* [Railsアプリつくった - ✘╹◡╹✘](r7kamura-20140406)

[rails]: https://github.com/rails/rails
[rails-api]: https://github.com/rails-api/rails-api
[pr-api]: https://github.com/rails/rails/pull/19832
[r7kamura-20140406]: http://r7kamura.hatenablog.com/entry/2014/04/06/023344