edge
詳細はrubyonrails.orgで: もっとRuby on Rails

Rack上のRails

このガイドでは、RailsのRackとの統合と他のRackコンポーネントとのインターフェースについて説明します。

このガイドを読み終えると、以下のことがわかります。

警告:このガイドは、Rackプロトコルやミドルウェア、URLマップ、Rack::BuilderなどのRackの基本的な知識を前提としています。

1 Rackの紹介

Rackは、Rubyでウェブアプリケーションを開発するための最小限の、モジュラーで適応性のあるインターフェースを提供します。HTTPリクエストとレスポンスを可能な限りシンプルな方法でラップすることにより、ウェブサーバー、ウェブフレームワーク、およびその間のソフトウェア(いわゆるミドルウェア)のAPIを統一し、単一のメソッド呼び出しにまとめます。

Rackの動作原理について説明することは、このガイドの範囲外です。Rackの基本について詳しく知りたい場合は、以下のリソースセクションを参照してください。

2 Rack上のRails

2.1 RailsアプリケーションのRackオブジェクト

Rails.applicationは、Railsアプリケーションの主要なRackアプリケーションオブジェクトです。Rack準拠のウェブサーバーは、Railsアプリケーションを提供するためにRails.applicationオブジェクトを使用する必要があります。

2.2 bin/rails server

bin/rails serverは、Rack::Serverオブジェクトを作成し、ウェブサーバーを起動する基本的なジョブを行います。

以下は、bin/rails serverRack::Serverのインスタンスを作成する方法です。

Rails::Server.new.tap do |server|
  require APP_PATH
  Dir.chdir(Rails.application.root)
  server.start
end

Rails::ServerRack::Serverを継承し、次のようにRack::Server#startメソッドを呼び出します。

class Server < ::Rack::Server
  def start
    # ...
    super
  end
end

2.3 rackup

Railsのbin/rails serverの代わりにrackupを使用するには、Railsアプリケーションのルートディレクトリのconfig.ruに次のコードを追加します。

# Rails.root/config.ru
require_relative "config/environment"
run Rails.application

そして、サーバーを起動します。

$ rackup config.ru

さまざまなrackupオプションについて詳しく知りたい場合は、次のコマンドを実行します。

$ rackup --help

2.4 開発と自動リロード

ミドルウェアは一度だけロードされ、変更は監視されません。実行中のアプリケーションに変更を反映するには、サーバーを再起動する必要があります。

3 Action Dispatcherミドルウェアスタック

Action Dispatcherの多くの内部コンポーネントは、Rackミドルウェアとして実装されています。Rails::Applicationは、さまざまな内部および外部のミドルウェアを組み合わせて完全なRails Rackアプリケーションを形成するためにActionDispatch::MiddlewareStackを使用します。

注意:ActionDispatch::MiddlewareStackは、Rack::BuilderのRails版ですが、Railsの要件を満たすためにより柔軟性と機能が向上しています。

3.1 ミドルウェアスタックの検査

Railsには、使用されているミドルウェアスタックを検査するための便利なコマンドがあります。

$ bin/rails middleware

新しく生成されたRailsアプリケーションでは、次のような結果が表示される場合があります。

use ActionDispatch::HostAuthorization
use Rack::Sendfile
use ActionDispatch::Static
use ActionDispatch::Executor
use ActionDispatch::ServerTiming
use ActiveSupport::Cache::Strategy::LocalCache::Middleware
use Rack::Runtime
use Rack::MethodOverride
use ActionDispatch::RequestId
use ActionDispatch::RemoteIp
use Sprockets::Rails::QuietAssets
use Rails::Rack::Logger
use ActionDispatch::ShowExceptions
use WebConsole::Middleware
use ActionDispatch::DebugExceptions
use ActionDispatch::ActionableExceptions
use ActionDispatch::Reloader
use ActionDispatch::Callbacks
use ActiveRecord::Migration::CheckPending
use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore
use ActionDispatch::Flash
use ActionDispatch::ContentSecurityPolicy::Middleware
use Rack::Head
use Rack::ConditionalGet
use Rack::ETag
use Rack::TempfileReaper
run MyApp::Application.routes

ここで表示されるデフォルトのミドルウェア(およびその他のいくつか)は、以下の内部ミドルウェアセクションで要約されています。

3.2 ミドルウェアスタックの設定

Railsは、application.rbまたは環境固有の設定ファイルenvironments/<environment>.rbを介して、ミドルウェアスタックにミドルウェアを追加、削除、変更するための簡単な設定インターフェースconfig.middlewareを提供しています。

3.2.1 ミドルウェアの追加

次のいずれかの方法を使用して、ミドルウェアスタックに新しいミドルウェアを追加できます。

  • config.middleware.use(new_middleware, args) - 新しいミドルウェアをミドルウェアスタックの一番下に追加します。

  • config.middleware.insert_before(existing_middleware, new_middleware, args) - 指定した既存のミドルウェアの前に新しいミドルウェアをミドルウェアスタックに追加します。

  • config.middleware.insert_after(existing_middleware, new_middleware, args) - 指定した既存のミドルウェアの後に新しいミドルウェアをミドルウェアスタックに追加します。

# config/application.rb

# Rack::BounceFaviconを一番下に追加
config.middleware.use Rack::BounceFavicon

# Lifo::CacheをActionDispatch::Executorの後に追加します。
# Lifo::Cacheに{ page_cache: false }引数を渡します。
config.middleware.insert_after ActionDispatch::Executor, Lifo::Cache, page_cache: false

3.2.2 ミドルウェアの交換

config.middleware.swapを使用して、ミドルウェアスタックの既存のミドルウェアを交換できます。

# config/application.rb

# ActionDispatch::ShowExceptionsをLifo::ShowExceptionsで置き換える
config.middleware.swap ActionDispatch::ShowExceptions, Lifo::ShowExceptions

3.2.3 ミドルウェアの移動

config.middleware.move_beforeおよびconfig.middleware.move_afterを使用して、ミドルウェアスタック内の既存のミドルウェアを移動できます。

# config/application.rb

# ActionDispatch::ShowExceptionsをLifo::ShowExceptionsの前に移動
config.middleware.move_before Lifo::ShowExceptions, ActionDispatch::ShowExceptions
# config/application.rb

# ActionDispatch::ShowExceptionsをLifo::ShowExceptionsの後に移動
config.middleware.move_after Lifo::ShowExceptions, ActionDispatch::ShowExceptions

3.2.4 ミドルウェアの削除

アプリケーションの設定に次の行を追加してください:

# config/application.rb
config.middleware.delete Rack::Runtime

そして、ミドルウェアスタックを検査すると、Rack::Runtimeが含まれていないことがわかります。

$ bin/rails middleware
(in /Users/lifo/Rails/blog)
use ActionDispatch::Static
use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x00000001c304c8>
...
run Rails.application.routes

セッション関連のミドルウェアを削除したい場合は、次の手順を実行してください:

# config/application.rb
config.middleware.delete ActionDispatch::Cookies
config.middleware.delete ActionDispatch::Session::CookieStore
config.middleware.delete ActionDispatch::Flash

ブラウザ関連のミドルウェアを削除するには、

# config/application.rb
config.middleware.delete Rack::MethodOverride

存在しないアイテムを削除しようとするとエラーが発生するようにするには、delete!を使用してください。

# config/application.rb
config.middleware.delete! ActionDispatch::Executor

3.3 内部ミドルウェアスタック

Action Controllerの多くの機能はミドルウェアとして実装されています。以下のリストは、それぞれの目的を説明しています:

ActionDispatch::HostAuthorization

  • DNSリバインディング攻撃から保護するために、リクエストを送信できるホストを明示的に許可します。設定手順については、構成ガイドを参照してください。

Rack::Sendfile

ActionDispatch::Static

  • publicディレクトリから静的ファイルを提供するために使用されます。config.public_file_server.enabledfalseの場合は無効になります。

Rack::Lock

  • env["rack.multithread"]フラグをfalseに設定し、アプリケーションをMutexでラップします。

ActionDispatch::Executor

  • 開発中のスレッドセーフなコードリロードに使用されます。

ActionDispatch::ServerTiming

  • リクエストのパフォーマンスメトリクスを含むServer-Timingヘッダーを設定します。

ActiveSupport::Cache::Strategy::LocalCache::Middleware

  • メモリキャッシュに使用されます。このキャッシュはスレッドセーフではありません。

Rack::Runtime

  • リクエストの実行にかかった時間(秒単位)を含むX-Runtimeヘッダーを設定します。

Rack::MethodOverride

  • params[:_method]が設定されている場合、メソッドを上書きすることを許可します。これはPUTおよびDELETE HTTPメソッドをサポートするミドルウェアです。

ActionDispatch::RequestId

  • レスポンスで一意のX-Request-Idヘッダーを利用できるようにし、ActionDispatch::Request#request_idメソッドを有効にします。

ActionDispatch::RemoteIp

  • IPスーフィング攻撃をチェックします。

Sprockets::Rails::QuietAssets

  • アセットリクエストのロガー出力を抑制します。

Rails::Rack::Logger

  • リクエストが開始したことをログに通知します。リクエストが完了した後、すべてのログをフラッシュします。

ActionDispatch::ShowExceptions

  • アプリケーションによって返された例外をキャッチし、エンドユーザー向けの形式でラップする例外アプリを呼び出します。

ActionDispatch::DebugExceptions

  • ローカルの場合、例外をログに記録し、デバッグページを表示する責任があります。

ActionDispatch::ActionableExceptions

  • Railsのエラーページからアクションをディスパッチする方法を提供します。

ActionDispatch::Reloader

  • 開発中のコードリロードを支援するための準備とクリーンアップのコールバックを提供します。

ActionDispatch::Callbacks

  • リクエストのディスパッチ前と後に実行されるコールバックを提供します。

ActiveRecord::Migration::CheckPending

  • 保留中のマイグレーションをチェックし、保留中のマイグレーションがある場合はActiveRecord::PendingMigrationErrorを発生させます。

ActionDispatch::Cookies

  • リクエストのためにクッキーを設定します。

ActionDispatch::Session::CookieStore

  • セッションをクッキーに格納する責任があります。

ActionDispatch::Flash

  • フラッシュキーを設定します。config.session_storeが値に設定されている場合にのみ使用できます。

ActionDispatch::ContentSecurityPolicy::Middleware

  • Content-Security-Policyヘッダーを設定するためのDSLを提供します。

Rack::Head

  • HEADリクエストをGETリクエストに変換し、それとして提供します。

Rack::ConditionalGet

  • "条件付きGET"をサポートし、ページが変更されていない場合にサーバーが何も応答しないようにします。

Rack::ETag

  • すべてのStringボディにETagヘッダーを追加します。ETagはキャッシュの検証に使用されます。

Rack::TempfileReaper

  • マルチパートリクエストのバッファリングに使用される一時ファイルをクリーンアップします。

上記のミドルウェアのいずれかをカスタムRackスタックで使用することができます。

4 リソース

4.1 Rackの学習

4.2 ミドルウェアの理解

フィードバック

このガイドの品質向上にご協力ください。

タイポや事実の誤りを見つけた場合は、ぜひ貢献してください。 開始するには、ドキュメントへの貢献セクションを読んでください。

不完全なコンテンツや最新でない情報も見つかるかもしれません。 メインのドキュメントに不足しているドキュメントを追加してください。 修正済みかどうかは、まずEdge Guidesを確認してください。 スタイルと規約については、Ruby on Rails Guides Guidelinesを確認してください。

修正すべき点を見つけたが、自分で修正できない場合は、 問題を報告してください

そして最後に、Ruby on Railsのドキュメントに関するあらゆる議論は、公式のRuby on Railsフォーラムで大歓迎です。