LoginSignup
194
136

More than 5 years have passed since last update.

Ruby on Rails 5のAPIモードと非APIモードのファイル差分

Last updated at Posted at 2016-07-03

Ruby on Rails 5からAPIモードが追加されましたが、rails new--api を使った場合のファイルの差分が気になったので調べてみました。

下記のコマンドで作成した差分を https://github.com/mh61503891/rails-5-comparison-of-with-api-and-without-api/commit/aa9503e4f7205e402fe133ddd01cb00e2bbb92f8 で公開しています。

rails new app --api
pushd app
git add *
git commit -m "with --api"
git push
popd
rails new app
pushd app
git add *
git commit -m "without --api"
git push

APIモードにするとどうなるん?

Gemfile

以下のgemsを使わないようです。

  • sass-rails
  • uglifier
  • coffee-rails
  • therubyracer
  • jquery-rails
  • turbolinks
  • web-console

UI関連のgemsが省かれています。

ただし、APIモードだけどActionCable (WebSocket) も使いたいよという場合は、サーバサイドのプログラムは多分JavaScriptで書くので therubyracer とか、CoffeeScriptを使うなら coffee-rails を入れとかなきゃですね。

config/application.rb

非APIモードだと以下のように rails/all がrequireされています。

config/application.rb
require 'rails/all'

ちなみに rails/allの中身はこんなです。

rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/railties-5.0.0/lib/rails/all.rb
require 'rails'

%w(
  active_record/railtie
  action_controller/railtie
  action_view/railtie
  action_mailer/railtie
  active_job/railtie
  action_cable/engine
  rails/test_unit/railtie
  sprockets/railtie
).each do |railtie|
  begin
    require railtie
  rescue LoadError
  end
end

で、APIモードだと以下のようにAPIモードに必要なライブラリだけ選択的にrequireできるよう個別にrequireするような記述に分割されています。

config/application.rb
require "rails"      
# Pick the frameworks you want:     
require "active_model/railtie"      
require "active_job/railtie"        
require "active_record/railtie"     
require "action_controller/railtie"     
require "action_mailer/railtie"     
require "action_view/railtie"       
require "action_cable/engine"       
# require "sprockets/railtie"       
require "rails/test_unit/railtie"

まあ、ほぼほぼ、同じようです。(少しだけ並びが違うのが気になるマンが参上して帰って行きました。)

あと以下の設定も追加されています。generatorとかがこれを見て挙動を変えるみたいです。

config/application.rb
config.api_only = true

config/environments/*

以下のファイルからアセットコンパイルとかアセット関連の設定が無くなっています。

  • -+ config/environments/production.rb
  • -+ config/environments/development.rb

config/initializers/*

アセットとかクッキーとかセッションストアのイニシャライザがありません。アセットはまあ不要という気がしますが、クッキーとかセッションストアのイニシャライザが無いのはmiddlewareでやりなさいというお告げ?

  • - config/initializers/assets.rb
  • - config/initializers/cookies_serializer.rb
  • - config/initializers/session_store.rb

CSRFとかCross-Origin Resource Sharing (CORS) の設定が、controllerではなくmiddlewareでやるように代わっています。ほほう。

  • - config/initializers/new_framework_defaults.rb: 非APIモードはここのcontrollerの設定で行う。
  • + config/initializers/cors.rb: APIモードはここのmiddlewareで設定を行う。

public/*.html

APIモードにはありません。そらな。

app/helpers/*

APIモードにヘルパーは不要なのでありません。

  • - app/helpers/application_helper.rb

app/views/layouts/*

ERBとかのビュー関連は無くなっています。

  • - app/views/layouts/application.html.erb

ただしメール関連のビューはAPIモードでも残っています。

  • app/views/layouts/mailer.html.erb
  • app/views/layouts/mailer.text.erb

app/assets/*

アセット関連のディレクトリがありません。javascriptsとかstylesheetsとかはともかく、imagesも無いので、どこに置くのか悩ましいです。APIモードでは画像はpublicかCDNにでも置きなはれというお告げ?

app/assets/javascripts/channels/*

ActionCableのサーバサイドのプログラムを置くディレクトリはAPIモードでもあります。

app/controllers/*

APIモードでのコントローラはActionController::APIを継承する。

app/controllers/application_controller.rb
class ApplicationController < ActionController::API
end
194
136
0

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
194
136