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::BaseとActionController::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-rails
,coffee-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/garageやROARのようなRepresenterが好みです.