LoginSignup
30

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-04-29

Rails API

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

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

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

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

Add ActionController API functionality · spastorino/rails@a8559ef

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

API Controller is a lightweight version of ActionController::Base, 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::BaseActionController::ApiでincludeされてるModule数を見比べてみると結構減ってるのがわかります.

rails new --api generates an api app skeleton · spastorino/rails@9432f85

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

--apiオプションにより,sprocketsまわりのgemが省略されるみたいです(sass-railscoffee-ralis,etc.).
API用のアプリになるんだから当たり前っちゃ当たり前ですが…
フロントはRailsから完全に切り離されることになるので,gulpもtypescriptもbrowserifyもbabelも使いたい放題です.やったね.

config.generators.api_only = true set rails api option on generators · spastorino/rails@2f93977

config.api_onlyを設定することで,scaffolding時に生成されるものがAPIアプリ仕様になるようです(最初はconfig.generators.api_onlyだったけど途中で変わった).
生成されるcontrollerがjsonを返すものになってたり,{asset,helper,view}sが生成されなかったり….

Disable jbuilder for Rails API apps, meanwhile it doesn't play nicely · spastorino/rails@b324328

APIなRailsではjbuliderが外されるみたいです.
generators/rails/scaffold_controller/templates/api_controller.rb#L10-L14を見た感じだと普通にrender jsonしてますね.

# 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)派がいておもしろいです.
どうでもいいですが,僕はcookpad/garageROARのようなRepresenterが好みです.

References

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30