Rails アプリケーションを設定する

このガイドではRailsアプリケーションで利用可能な設定と初期化機能について説明いたします。

このガイドの内容:

1 初期化コードの置き場所

Railsには初期化コードの置き場所が4箇所あります。

  • config/application.rb
  • 環境に応じた設定ファイル
  • イニシャライザ
  • アフターイニシャライザ

2 Rails実行前にコードを実行する

アプリケーションで何らかのコードを、Rails自体が読み込まれる前に実行する必要が生じることがまれにあります。その場合は、実行したいコードをconfig/application.rbファイルのrequire 'rails/all'行より前に書いてください。

3 Railsコンポーネントを構成する

一般に、Railsの設定作業とはRails自身を設定することでもあると同時に、Railsのコンポーネントを設定することでもあります。config/application.rbおよび環境固有の設定ファイル(config/environments/production.rbなど)に設定を記入することで、Railsのすべてのコンポーネントにそれらの設定を渡すことができます。

たとえば、config/application.rbファイルには以下の設定が含まれています。

config.autoload_paths += %W(#{config.root}/extras)

これはRails自身のための設定です。設定をすべてのRailsコンポーネントに渡したい場合は、config/application.rb内の同じconfigオブジェクトを使用して行なうことができます。

config.active_record.schema_format = :ruby

この設定は、特にActive Recordの設定に使用されます。

3.1 Rails全般の設定

Rails全般に対する設定を行うには、Rails::Railtieオブジェクトを呼び出すか、Rails::EngineRails::Applicationのサブクラスを呼び出します。

  • config.after_initializeにはブロックを渡すことができます。このブロックは、Railsによるアプリケーションの初期化が完了した 直後 に実行されます。アプリケーションの初期化作業には、フレームワーク自体の初期化、エンジンの初期化、そしてconfig/initializersに記述されたすべてのアプリケーションイニシャライザの実行が含まれます。ここで渡すブロックはrakeタスクとして実行される ことにご注意ください。このブロックは、他のイニシャライザによって設定される値を設定するのに便利です。

    config.after_initialize do
      ActionView::Base.sanitized_allowed_tags.delete 'div'
    end
    
  • config.asset_hostはアセットを置くホストを設定します。この設定は、アセットの置き場所がCDN (Contents Delivery Network) の場合や、別のドメインエイリアスを使用するとブラウザの同時実行制限にひっかかるのを避けたい場合に便利です。このメソッドはconfig.action_controller.asset_hostを短縮したものです。

  • config.autoload_once_pathsは、サーバーへのリクエストごとにクリアされない定数を自動読込するパスの配列を引数に取ります。この設定はconfig.cache_classesがfalseの場合に影響を受けます。config.cache_classesはdevelopmentモードではconfig.cache_classesはデフォルトでオフです。config.cache_classesがtrueの場合、すべてのconfig.autoload_once_paths自動読み込みは一度しか行われません。config.autoload_once_pathsの配列に含まれる要素は、次で説明するautoload_pathsにもまったく同じように含めておく必要があります。config.autoload_once_pathsのデフォルト値は、空の配列です。

  • config.autoload_pathsはRailsが定数を自動読込するパスを含む配列を引数に取ります。config.autoload_pathsのデフォルト値は、app以下のすべてのディレクトリです(訳注: Rails3からはautoload_pathの設定はデフォルトでは無効です)。

  • config.cache_classesは、アプリケーションのクラスやモジュールをリクエストごとに再読み込みするか(=キャッシュしないかどうか)どうかを指定します。config.cache_classesのデフォルト値は、developmentモードではfalseなのでコードの更新がすぐ反映され、testモードとproductionモードではtrueなので動作が高速になります。同時にthreadsafe!をオンにすることもできます。

  • config.action_view.cache_template_loadingは、リクエストのたびにビューテンプレートを再読み込みするか(=キャッシュしないか)を指定します。

  • config.beginning_of_weekは、アプリケーションにおける週の初日を設定します。引数には、曜日を表す正しいシンボルを渡します(:mondayなど)。

  • config.cache_storeはRailsでのキャッシュ処理に使用されるキャッシュストアを設定します。指定できるオプションは次のシンボル:memory_store:file_store:mem_cache_store:null_storeのいずれか、またはキャッシュAPIを実装するオブジェクトです。tmp/cacheディレクトリが存在する場合のデフォルトは:file_storeに設定され、それ以外の場合のデフォルトは:memory_storeに設定されます。

  • config.colorize_loggingは、出力するログ情報にANSI色情報を与えるかどうかを指定します。デフォルトはtrueです。

  • config.consider_all_requests_localはフラグです。このフラグがtrueの場合、どのような種類のエラーが発生した場合にも詳細なデバッグ情報がHTTPレスポンスに出力され、アプリケーションの実行時コンテキストがRails::Infoコントローラによって/rails/info/propertiesに出力されます。このフラグはdevelopmentモードとtestモードではtrue、productionモードではfalseに設定されます。もっと細かく制御したい場合は、このフラグをfalseに設定してから、コントローラでlocal_request?メソッドを実装し、エラー時にどのデバッグ情報を出力するかをそこで指定してください。

  • config.consoleを使用すると、コンソールでrails consoleを実行する時に使用されるクラスをカスタマイズできます。このメソッドはconsoleブロックで使用するのが最適です。

    console do
      # このブロックはコンソールで実行されるときしか呼び出されない
      # 従ってここでpryを呼び出しても問題ない
      require "pry"
      config.console = Pry
    end
    
  • config.dependency_loadingをfalseに設定すると、定数自動読み込み設定をオフにします。このオプションが効くのはconfig.cache_classesがtrueの場合のみです(config.cache_classesはproductionモードではデフォルトでtrueです)。config.threadsafe!を使用するとこのフラグはfalseになります。

  • config.eager_loadをtrueにすると、config.eager_load_namespacesに登録された事前一括読み込み(eager loading)用の名前空間をすべて読み込みます。ここにはアプリケーション、エンジン、Railsフレームワークを含むあらゆる登録済み名前空間が含まれます。

  • config.eager_load_namespacesを使用して登録した名前は、config.eager_loadがtrueのときに読み込まれます。登録された名前空間は、必ずeager_load!メソッドに応答しなければなりません。

  • config.eager_load_pathsは、パスの配列を引数に取ります。Railsは、cache_classesがオンの場合にこのパスから事前一括読み込み(eager load)します。デフォルトではアプリケーションのappディレクトリ以下のすべてのディレクトリが対象です。

  • config.encodingはアプリケーション全体のエンコーディングを指定します。デフォルトはUTF-8です。

  • config.exceptions_appは、例外が発生したときにShowExceptionミドルウェアによって呼び出されるアプリケーション例外を設定します。デフォルトはActionDispatch::PublicExceptions.new(Rails.public_path)です。

  • config.file_watcherは、config.reload_classes_only_on_changeがtrueの場合にファイルシステム上のファイル更新検出に使用されるクラスを指定します。ActiveSupport::FileUpdateChecker APIに従う必要があります。

  • config.filter_parametersは、パスワードやクレジットカード番号など、ログに出力したくないパラメータをフィルタで除外するために使用します。パスワードを除外するアプリケーションフィルタを追加するにはconfig/initializers/filter_parameter_logging.rbconfig.filter_parameters+=[:password]に追加します。

  • config.force_sslは、ActionDispatch::SSLミドルウェアを使用して、すべてのリクエストをHTTPSプロトコル下で実行するよう強制します。

  • config.log_formatterはRailsロガーのフォーマットを定義します。このオプションは、デフォルトではActiveSupport::Logger::SimpleFormatterのインスタンスを使用します。ただしproductionモードの場合のみLogger::Formatterがデフォルトになります。

  • config.log_levelは、Railsのログ出力をどのぐらい詳細にするかを指定します。デフォルトでは:debugが指定されます。productionモードのみデフォルトで:infoが指定されます。

  • config.log_tagsは、requestオブジェクトが応答するメソッドのリストを引数に取ります。これは、ログの行にデバッグ情報をタグ付けする場合に便利です。たとえばサブドメインやリクエストidを指定することができ、これらはマルチユーザーのproductionモードアプリケーションをデバッグするのに便利です。

  • config.loggerは、ロガーを指定します。指定されるロガーは、Log4rまたはRubyのデフォルトのLoggerクラスのインターフェイスに従います。デフォルトではActiveSupport::Loggerのログが指定されます。これはproductionモードでは自動的にログを出力します。

  • config.middlewareは、アプリケーションで使用するミドルウェアをカスタマイズできます。詳細についてはミドルウェアを設定するの節を参照してください。

  • config.reload_classes_only_on_changeは、監視しているファイルが変更された場合にのみクラスを再読み込みするかどうかを指定します。デフォルトでは、autoload_pathで指定されたすべてのファイルが監視対象となり、デフォルトでtrueが設定されます。config.cache_classesがオンの場合はこのオプションは無視されます。

secrets.secret_key_baseメソッドは、改竄防止のために、アプリケーションのセッションを既知の秘密キーと照合するためのキーを指定するときに使います。アプリケーションはsecrets.secret_key_baseを使用して、config/secrets.ymlなどに保存されるキーをランダムに初期化します。

  • config.serve_static_assetsは、静的アセットを扱うかどうかを指定します。デフォルトではtrueが設定されますが、production環境ではアプリケーションを実行するNginxやApacheなどのサーバーが静的アセットを扱う必要があるので、オフになります。デフォルトの設定とは異なり、WEBrickを使用してアプリケーションをproductionモードで実行したり(これは絶対にやらないでください)テストする場合はtrueに設定されます。そうでないと、ページキャッシュが有効にならず、publicディレクトリ以下に常駐する静的ファイルへのリクエストが毎回Railsアプリケーションを経由してしまいます。

  • config.session_storeは、通常はconfig/initializers/session_store.rbで設定されるものであり、セッションを保存するクラスを指定します。指定できる値は:cookie_store(デフォルト)、:mem_cache_store:disabledです。:disabledを指定すると、Railsでセッションが扱われなくなります。カスタムセッションストアを指定することもできます。

    config.session_store :my_custom_store
    

カスタムストアはActionDispatch::Session::MyCustomStoreとして定義する必要があります。

  • config.time_zoneはアプリケーションのデフォルトタイムゾーンを設定し、Active Recordで認識できるようにします。

3.2 アセットを設定する

  • config.assets.enabledは、アセットパイプラインを有効にするかどうかを指定します。デフォルトはtrueです。

  • config.assets.raise_runtime_errorstrueに設定すると、ランタイムエラーチェックが追加で有効になります。このオプションはproduction環境で使用するとデプロイ時に思わぬ動作をする可能性がありますので、development環境(config/environments/development.rb)で使用することをお勧めします。

  • config.assets.compressは、コンパイル済みアセットを圧縮するかどうかを指定するフラグです。config/environments/production.rbでは明示的にtrueに設定されています。

  • config.assets.css_compressorは、CSSの圧縮に使用するプログラムを定義します。このオプションは、sass-railsを使用するとデフォルトで設定されます。このオプションでは:yuiという一風変わったオプションを指定できます。これはyui-compressor gemのことです。

  • config.assets.js_compressorは、JavaScriptの圧縮に使用するプログラムを定義します。指定できる値は:closure:uglifier:yuiです。それぞれclosure-compileruglifieryui-compressor gemに対応します。

  • config.assets.pathsには、アセット探索用のパスを指定します。この設定オプションにパスを追加すると、アセットの検索先として追加されます。

  • config.assets.precompileは、application.cssapplication.js以外に追加したいアセットがある場合に指定します。これらはrake assets:precompileを実行するときに一緒にプリコンパイルされます。

  • config.assets.prefixはアセットを置くディレクトリを指定します。デフォルトは/assetsです。

  • config.assets.digestは、アセット名に使用するMD5フィンガープリントを有効にするかどうかを指定します。production.rbではデフォルトでtrueに設定されます。

  • config.assets.debugは、デバッグ用にアセットの連結と圧縮をやめるかどうかを指定します。development.rbではデフォルトでtrueに設定されます。

  • config.assets.cache_storeは、Sprocketsで使用するキャッシュストアを定義します。デフォルトではRailsのファイルストアが使用されます。

  • config.assets.versionはMD5ハッシュ生成に使用されるオプション文字列です。この値を変更すると、すべてのアセットファイルが強制的にリコンパイルされます。

  • config.assets.compileは、production環境での動的なSprocketsコンパイルをオンにするかどうかをtrue/falseで指定します。

  • config.assets.loggerはロガーを引数に取ります。このロガーは、Log4のインターフェイスか、RubyのLoggerクラスに従います。デフォルトでは、config.loggerと同じ設定が使用されます。config.assets.loggerをfalseに設定すると、アセットのログ出力がオフになります

3.3 ジェネレータの設定

config.generatorsメソッドを使用して、Railsで使用されるジェネレータを変更できます。このメソッドはブロックを1つ取ります。

config.generators do |g|
  g.orm :active_record
  g.test_framework :test_unit
end

ブロックで使用可能なメソッドの完全なリストは以下のとおりです。

  • assetsは、scaffoldを生成するかどうかを指定します。デフォルトはtrueです。
  • force_pluralは、モデル名を複数形にするかどうかを指定します。デフォルトはfalseです。
  • helperはヘルパーを生成するかどうかを指定します。デフォルトはtrueです。
  • integration_toolは、使用する統合ツールを定義します。デフォルトはnilです。
  • javascriptsは、生成時にJavaScriptファイルへのフックをオンにするかどうかを指定します。この設定はscaffoldジェネレータの実行中に使用されます。デフォルトはtrueです。
  • javascript_engineは、アセット生成時に(coffeeなどで)使用するエンジンを設定します。デフォルトはnilです。
  • ormは、使用するORM (オブジェクトリレーショナルマッピング) を指定します。デフォルトはfalseであり、この場合はActive Recordが使用されます。
  • resource_controllerは、rails generate resourceの実行時にどのジェネレータを使用してコントローラを生成するかを指定します。デフォルトは:controllerです。
  • scaffold_controllerresource_controllerと同じではありません。scaffold_controllerscaffold でどのジェネレータを使用してコントローラを生成するか(rails generate scaffoldの実行時)を指定します。デフォルトは:scaffold_controllerです。
  • stylesheetsは、ジェネレータでスタイルシートのフックを行なうかどうかを指定します。この設定はscaffoldジェネレータの実行時に使用されますが、このフックは他のジェネレータでも使用されます。デフォルトはtrueです。
  • stylesheet_engineは、アセット生成時に使用される、sassなどのスタイルシートエンジンを指定します。デフォルトは:cssです。
  • test_frameworkは、使用するテストフレームワークを指定します。デフォルトはfalseであり、この場合はTest::Unitが使用されます。
  • template_engineはビューのテンプレートエンジン(ERBやHamlなど)を指定します。デフォルトは:erbです。

3.4 ミドルウェアを設定する

どのRailsアプリケーションの背後にも、いくつかの標準的なミドルウェアが配置されています。development環境では、以下の順序でミドルウェアを使用します。

  • ActionDispatch::SSLはすべてのリクエストにHTTPSプロトコルを強制します。これはconfig.force_ssltrueにすると有効になります。渡すオプションはconfig.ssl_optionsで設定できます。
  • ActionDispatch::Staticは静的アセットで使用されます。config.serve_static_assetsfalseにするとオフになります。
  • Rack::Lockは、アプリケーションをミューテックスでラップし、1度に1つのスレッドでしか呼び出されないようにします。このミドルウェアは、config.cache_classesfalseに設定されている場合のみ有効になります。
  • ActiveSupport::Cache::Strategy::LocalCacheは基本的なメモリバックアップ式キャッシュとして機能します。このキャッシュはスレッドセーフではなく、単一スレッド用の一時メモリキャッシュとして機能することのみを意図していることにご注意ください。
  • Rack::RuntimeX-Runtimeヘッダーを設定します。このヘッダーには、リクエストの実行にかかる時間(秒)が含まれます。
  • Rails::Rack::Loggerは、リクエストが開始されたことをログに通知します。リクエストが完了すると、すべてのログをフラッシュします。
  • ActionDispatch::ShowExceptionsは、アプリケーションから返されるすべての例外をrescueし、リクエストがローカルであるかconfig.consider_all_requests_localtrueに設定されている場合に適切な例外ページを出力します。config.action_dispatch.show_exceptionsfalseに設定されていると、常に例外が出力されます。
  • ActionDispatch::RequestIdは、レスポンスで使用できる独自のX-Request-Idヘッダーを作成し、ActionDispatch::Request#uuidメソッドを有効にします。
  • ActionDispatch::RemoteIpはIPスプーフィング攻撃が行われていないかどうかをチェックし、リクエストヘッダーから正しいclient_ipを取得します。この設定はconfig.action_dispatch.ip_spoofing_checkオプションとconfig.action_dispatch.trusted_proxiesオプションで変更可能です。
  • Rack::Sendfileは、bodyが1つのファイルから作成されているレスポンスをキャッチし、サーバー固有のX-Sendfileヘッダーに差し替えてから送信します。この動作はconfig.action_dispatch.x_sendfile_headerで設定可能です。
  • ActionDispatch::Callbacksは、リクエストに応答する前に、事前コールバックを実行します。
  • ActiveRecord::ConnectionAdapters::ConnectionManagementは、リクエストごとにアクティブな接続をクリアします。ただしリクエスト環境でrack.testキーがtrueに設定されている場合を除きます。
  • ActiveRecord::QueryCacheは、リクエストによって生成されたすべてのSELECTクエリをキャッシュします。INSERTまたはUPDATEが発生するとキャッシュはクリアされます。
  • ActionDispatch::Cookiesはリクエストに対応するcookieを設定します。
  • ActionDispatch::Session::CookieStoreは、セッションをcookieに保存する役割を担います。config.action_controller.session_storeの値を変更すると別のミドルウェアを使用できます。これに渡されるオプションはconfig.action_controller.session_optionsを使用して設定できます。
  • ActionDispatch::Flashflashキーを設定します。これは、config.action_controller.session_storeに値が設定されている場合にのみ有効です。
  • ActionDispatch::ParamsParserは、リクエストからパラメータを切り出してparamsに保存します。
  • Rack::MethodOverrideは、params[:_method]が設定されている場合にメソッドを上書きできるようにします。これは、HTTPでPATCH、PUT、DELETEメソッドを使用できるようにするミドルウェアです。
  • ActionDispatch::Headは、HEADリクエストをGETリクエストに変換し、HEADリクエストが機能するようにします。

config.middleware.useメソッドを使用すると、上記以外に独自のミドルウェアを追加することもできます。

config.middleware.use Magical::Unicorns

上の指定により、Magical::Unicornsミドルウェアがスタックの最後に追加されます。あるミドルウェアの前に別のミドルウェアを追加したい場合はinsert_beforeを使用します。

config.middleware.insert_before ActionDispatch::Head, Magical::Unicorns

あるミドルウェアの後に別のミドルウェアを追加したい場合はinsert_afterを使用します。

config.middleware.insert_after ActionDispatch::Head, Magical::Unicorns

これらのミドルウェアは、まったく別のものに差し替えることもできます。

config.middleware.swap ActionController::Failsafe, Lifo::Failsafe

同様に、ミドルウェアをスタックから完全に取り除くこともできます。

config.middleware.delete "Rack::MethodOverride"

3.5 i18nを設定する

以下のオプションはすべてi18n(internationalization: 国際化)ライブラリ用のオプションです。

  • config.i18n.available_localesは、アプリケーションで利用できるロケールをホワイトリスト化します。デフォルトでは、ロケールファイルにあるロケールキーはすべて有効になりますが、新しいアプリケーションの場合、通常は:enだけです。

  • config.i18n.default_localeは、アプリケーションのi18nで使用するデフォルトのロケールを設定します。デフォルトは:enです。

  • config.i18n.enforce_available_localesがオンになっていると、available_localesリストで宣言されていないロケールはi18nに渡せなくなります。利用できないロケールがある場合はi18n::InvalidLocale例外が発生します。デフォルトはtrueです。このオプションは、ユーザー入力のロケールが不正である場合のセキュリティ対策であるため、特別な理由がない限り無効にしないでください。

  • config.i18n.load_pathは、ロケールファイルの探索パスを設定します。デフォルトはconfig/locales/*.{yml,rb}です。

3.6 Active Recordを設定する。

config.active_recordには多くのオプションが含まれています。

  • config.active_record.loggerは、Log4rのインターフェイスまたはデフォルトのRuby Loggerクラスに従うロガーを引数として取ります。このロガーは以後作成されるすべての新しいデータベース接続に渡されます。Active Recordのモデルクラスまたはモデルインスタンスに対してloggerメソッドを呼び出すと、このロガーを取り出せます。ログ出力を無効にするにはnilを設定します。

  • config.active_record.primary_key_prefix_typeは、主キーカラムの命名法を変更するのに使用します。Railsのデフォルトでは、主キーカラムの名前にidが使用されます (なおidにしたい場合は値を設定する必要はありません)。id以外に以下の2つを指定できます。 ** :table_nameを指定すると、たとえばCustomerクラスの主キーはcustomeridになります ** :table_name_with_underscoreを指定すると、たとえばCustomerクラスの主キーはcustomer_idになります

  • config.active_record.table_name_prefixは、テーブル名の冒頭にグローバルに追加したい文字列を指定します。たとえばnorthwest_を指定すると、Customerクラスはnorthwest_customersをテーブルとして探します。デフォルトは空文字列です。

  • config.active_record.table_name_suffixはテーブル名の後ろにグローバルに追加したい文字列を指定します。たとえば_northwestを指定すると、Customerはcustomers_northwestをテーブルとして探します。デフォルトは空文字列です。

  • config.active_record.schema_migrations_table_nameは、スキーママイグレーションテーブルの名前として使用する文字列を指定します。

  • config.active_record.pluralize_table_namesは、Railsが探すデータベースのテーブル名を単数形にするか複数形にするかを指定します。trueに設定すると、Customerクラスが使用するテーブル名は複数形のcustomersになります(デフォルト)。falseに設定すると、Customerクラスが使用するテーブル名は単数形のcustomerになります。

  • config.active_record.default_timezoneは、データベースから日付・時刻を取り出した際のタイムゾーンをTime.local (:localを指定した場合)とTime.utc (:utcを指定した場合)のどちらにするかを指定します。デフォルトは:utcです。

  • config.active_record.schema_formatは、データベーススキーマをファイルに書き出す際のフォーマットを指定します。デフォルトは:rubyで、データベースには依存せず、マイグレーションに依存します。:sqlを指定するとSQL文で書き出されますが、この場合潜在的にデータベースに依存する可能性があります。

  • config.active_record.timestamped_migrationsは、マイグレーションファイル名にシリアル番号とタイムスタンプのどちらを与えるかを指定します。デフォルトはtrueで、タイムスタンプが使用されます。開発者が複数の場合は、タイムスタンプの使用をお勧めします。

  • config.active_record.lock_optimisticallyは、Active Recordで楽観的ロック(optimistic locking)を使用するかどうかを指定します。デフォルトはtrue(使用する)です。

  • config.active_record.cache_timestamp_formatは、キャッシュキーに含まれるタイムスタンプ値の形式を指定します。デフォルトは:numberです。

  • config.active_record.record_timestampsは、モデルで発生するcreate操作やupdate操作にタイムスタンプを付けるかどうかを指定する論理値です。デフォルト値はtrueです。

  • config.active_record.partial_writesは、部分書き込みを行なうかどうか(「dirty」とマークされた属性だけを更新するか)を指定する論理値です。データベースで部分書き込みを使用する場合は、config.active_record.lock_optimisticallyで楽観的ロックも使用する必要があります。これは、同時更新が行われた場合に、読み出しの状態が古い情報に基づいて属性に書き込まれる可能性があるためです。デフォルト値はtrueです。

  • config.active_record.attribute_types_cached_by_defaultは、ActiveRecord::AttributeMethodsが読み出し時にデフォルトでキャッシュする属性の種類を指定します。デフォルトは[:datetime, :timestamp, :time, :date]です。

  • config.active_record.maintain_test_schemaは、テスト実行時にActive Recordがテスト用データベーススキーマをdb/schema.rb(またはdb/structure.sql)に基いて最新の状態にするかどうかを指定します。デフォルト値はtrueです。

  • config.active_record.dump_schema_after_migrationは、マイグレーション実行時にスキーマダンプ(db/schema.rbまたはdb/structure.sql)を行なうかどうかを指定します。このオプションは、Railsが生成するconfig/environments/production.rbではfalseに設定されます。このオプションが無指定の場合は、デフォルトのtrueが指定されます。

MySQLアダプターを使用すると、以下の設定オプションが1つ追加されます。

  • ActiveRecord::ConnectionAdapters::MysqlAdapter.emulate_booleansは、Active RecordがMySQLデータベース内のすべてのtinyint(1)カラムをデフォルトでbooleanにするかどうかを指定します。デフォルトはtrueです。

スキーマダンパーは以下のオプションを追加します。

  • ActiveRecord::SchemaDumper.ignore_tablesはテーブル名の配列を1つ引数に取ります。どのスキーマファイルにも 含めたくない テーブル名がある場合はこの配列にテーブル名を含めます。この設定は、config.active_record.schema_format == :rubyで「ない」場合は無視されます。

3.7 Action Controllerを設定する

config.action_controllerには多数の設定が含まれています。

  • config.action_controller.asset_hostはアセットを置くためのホストを設定します。これは、アセットをホストする場所としてアプリケーションサーバーの代りにCDN(コンテンツ配信ネットワーク)を使用したい場合に便利です。

  • config.action_controller.perform_cachingは、アプリケーションでキャッシュを行なうかどうかを指定します。developmentモードではfalse、productionモードではtrueに設定します。

  • config.action_controller.default_static_extensionは、キャッシュされたページに与える拡張子を指定します。デフォルトは.htmlです。

  • config.action_controller.default_charsetは、すべての画面出力で使用されるデフォルトの文字セットを指定します。デフォルトは"utf-8"です。

  • config.action_controller.loggerは、Log4rのインターフェイスまたはデフォルトのRuby Loggerクラスに従うロガーを引数として取ります。このロガーは、Action Controllerからの情報をログ出力するために使用されます。ログ出力を無効にするにはnilを設定します。

  • config.action_controller.request_forgery_protection_tokenは、RequestForgery対策用のトークンパラメータ名を設定します。protect_from_forgeryを呼び出すと、デフォルトで:authenticity_tokenが設定されます。

  • config.action_controller.allow_forgery_protectionは、CSRF保護をオンにするかどうかを指定します。testモードではデフォルトでfalseに設定され、それ以外ではtrueに設定されます。

  • config.action_controller.relative_url_rootは、サブディレクトリへのデプロイを行うことをRailsに伝えるために使用できます。デフォルトはENV['RAILS_RELATIVE_URL_ROOT']です。

  • config.action_controller.permit_all_parametersは、マスアサインメントされるすべてのパラメータをデフォルトで許可することを設定します。デフォルト値はfalseです。

  • config.action_controller.action_on_unpermitted_parametersは、明示的に許可されていないパラメータが見つかった場合にログ出力または例外発生を行なうかどうかを指定します。このオプションは、:logまたは:raiseを指定すると有効になります。test環境とdevelopment環境でのデフォルトは:logであり、それ以外の環境ではfalseが設定されます。

3.8 Action Dispatchを設定する

  • config.action_dispatch.session_storeはセッションデータのストア名を設定します。デフォルトのストア名は:cookie_storeです。この他に:active_record_store:mem_cache_store、またはカスタムクラスの名前を指定できます。

  • config.action_dispatch.default_headersは、HTTPヘッダーで使用されるハッシュです。このヘッダーはデフォルトですべてのレスポンスに設定されます。このオプションは、デフォルトでは以下のように設定されます。

    config.action_dispatch.default_headers = {
      'X-Frame-Options' => 'SAMEORIGIN',
      'X-XSS-Protection' => '1; mode=block',
      'X-Content-Type-Options' => 'nosniff'
    }
    
  • config.action_dispatch.tld_lengthは、アプリケーションで使用するトップレベルドメイン(TLD) の長さを指定します。デフォルトは1です。

  • config.action_dispatch.http_auth_saltは、HTTP Authのsalt値(訳注: ハッシュの安全性を強化するために加えられるランダムな値)を設定します。デフォルトは'http authentication'です。

  • config.action_dispatch.signed_cookie_saltは、署名済みcookie用のsalt値を設定します。デフォルトは'signed cookie'です。

  • config.action_dispatch.encrypted_cookie_saltは、暗号化済みcookie用のsalt値を設定します。デフォルトは'encrypted cookie'です。

  • config.action_dispatch.encrypted_signed_cookie_saltは、署名暗号化済みcookie用のsalt値を設定します。デフォルトは'signed encrypted cookie'です。

  • config.action_dispatch.perform_deep_mungeは、パラメータに対してdeep_mungeメソッドを実行すべきかどうかを指定します。詳細についてはセキュリティガイドを参照してください。デフォルトはtrueです。

  • ActionDispatch::Callbacks.beforeには、リクエストより前に実行したいコードブロックを1つ引数として与えます。

  • ActionDispatch::Callbacks.to_prepareには、リクエストより前かつActionDispatch::Callbacks.beforeより後に実行したいコードブロックを1つ引数として与えます。このブロックは、developmentモードではすべてのリクエストで実行されますが、productionモードや、cache_classestrueに設定されている環境では1度しか実行されません。

  • ActionDispatch::Callbacks.afterには、リクエストの後に実行したいコードブロックを1つ引数として与えます。

3.9 Action Viewを設定する

config.action_viewにもわずかながら設定があります。

  • config.action_view.field_error_procは、Active Recordで発生したエラーの表示に使用するHTMLジェネレータを指定します。デフォルトは以下のとおりです。

    Proc.new do |html_tag, instance|
      %Q(<div class="field_with_errors">#{html_tag}</div>).html_safe
    end
    
  • config.action_view.default_form_builderは、Railsでデフォルトで使用するフォームビルダーを指定します。デフォルトは、ActionView::Helpers::FormBuilderです。フォームビルダーを初期化処理の後に読み込みたい場合(こうすることでdevelopmentモードではフォームビルダーがリクエストのたびに再読込されます)、Stringとして渡すこともできます。

  • config.action_view.loggerは、Log4rのインターフェイスまたはデフォルトのRuby Loggerクラスに従うロガーを引数としてとります。このロガーは、Action Viewからの情報をログ出力するために使用されます。ログ出力を無効にするにはnilを設定します。

  • config.action_view.erb_trim_modeは、ERBで使用するトリムモードを指定します。デフォルトは'-'で、<%= -%>または<%= =%>の場合に末尾スペースを削除して改行します。詳細についてはErubisドキュメントを参照してください。

  • config.action_view.embed_authenticity_token_in_remote_formsは、フォームで:remote => trueを使用した場合のauthenticity_tokenのデフォルトの動作を設定します。デフォルトではfalseであり、この場合リモートフォームにはauthenticity_tokenフォームが含まれません。これはフォームでフラグメントキャッシュを使用している場合に便利です。リモートフォームはmetaタグから認証を受け取るので、JavaScriptの動作しないブラウザをサポートしなければならないのでなければトークンの埋め込みは不要です。JavaScriptが動かないブラウザのサポートが必要な場合は、:authenticity_token => trueをフォームオプションとして渡すか、この設定をtrueにします。

  • config.action_view.prefix_partial_path_with_controller_namespaceは、名前空間化されたコントローラから出力されたテンプレートにあるサブディレクトリから、パーシャル(部分テンプレート)を探索するかどうかを指定します。たとえば、Admin::PostsControllerというコントローラがあり、以下のテンプレートを出力するとします。

    <%= render @post %>
    

このデフォルト設定はtrueであり、/admin/posts/_post.erbにあるパーシャルを使用しています。この値をfalseにすると、/posts/_post.erbが描画されます。この動作は、PostsControllerなどの名前空間化されていないコントローラで描画した場合と同じです。

  • config.action_view.raise_on_missing_translationsは、i18nで訳文が失われている場合にエラーを発生させるかどうかを指定します。

3.10 Action Mailerを設定する

config.action_mailerには多数の設定オプションがあります。

  • config.action_mailer.loggerは、Log4rのインターフェイスまたはデフォルトのRuby Loggerクラスに従うロガーを引数として取ります。このロガーは、Action Mailerからの情報をログ出力するために使用されます。ログ出力を無効にするにはnilを設定します。

  • config.action_mailer.smtp_settingsは、:smtp配信方法を詳細に設定するのに使用できます。これはオプションのハッシュを引数に取り、以下のどのオプションでも含めることができます。

    • :address - リモートのメールサーバーを指定します。デフォルトの"localhost"設定から変更します。
    • :port - 使用するメールサーバーのポートが25番でないのであれば(めったにないと思いますが)、ここで対応できます。
    • :domain - HELOドメインの指定が必要な場合に使用します。
    • :user_name - メールサーバーで認証が要求される場合は、ここでユーザー名を設定します。
    • :password - メールサーバーで認証が要求される場合は、ここでパスワードを設定します。
    • :authentication - メールサーバーで認証が要求される場合は、ここで認証の種類を指定します。:plain:login:cram_md5のいずれかのシンボルを指定できます。
  • config.action_mailer.sendmail_settingsは、:sendmail配信方法を詳細に設定するのに使用できます。これはオプションのハッシュを引数に取り、以下のどのオプションでも含めることができます。

    • :location - sendmail実行ファイルの場所。デフォルトは/usr/sbin/sendmailです。
    • :arguments - コマンドラインに与える引数。デフォルトは-i -tです。
  • config.action_mailer.raise_delivery_errorsは、メールの配信が完了しなかった場合にエラーを発生させるかどうかを指定します。デフォルトはtrueです。

  • config.action_mailer.delivery_methodは、配信方法を指定します。デフォルトは:smtpです。詳細については、Action Mailerガイドを参照してください。

  • config.action_mailer.perform_deliveriesは、メールを実際に配信するかどうかを指定します。デフォルトはtrueです。テスト時にメール送信を抑制するのに便利です。

  • config.action_mailer.default_optionsは、Action Mailerのデフォルトを設定します。これは、メイラーごとにfromreply_toなどを設定します。デフォルトは以下のとおりです。

    mime_version:  "1.0",
    charset:       "UTF-8",
    content_type: "text/plain",
    parts_order:  ["text/plain", "text/enriched", "text/html"]
    

    ハッシュを1つ指定してオプションを追加することもできます。

    config.action_mailer.default_options = {
      from: "noreply@example.com"
    }
    
  • config.action_mailer.observersは、メールを配信したときに通知を受けるオブザーバーを指定します。

    config.action_mailer.observers = ["MailObserver"]
    
  • config.action_mailer.interceptorsは、メールを送信する前に呼び出すインターセプタを登録します。

    config.action_mailer.interceptors = ["MailInterceptor"]
    

3.11 Active Supportを設定する

Active Supportにもいくつかの設定オプションがあります。

  • config.active_support.bareは、Rails起動時にactive_support/allの読み込みを行なうかどうかを指定します。デフォルトはnilであり、この場合active_support/allは読み込まれます。

  • config.active_support.escape_html_entities_in_jsonは、JSONシリアライズに含まれるHTMLエンティティをエスケープするかどうかを指定します。デフォルトはfalseです。

  • config.active_support.use_standard_json_time_formatは、ISO 8601フォーマットに従った日付のシリアライズを行なうかどうかを指定します。デフォルトはtrueです。

  • config.active_support.time_precisionは、JSONエンコードされた時間値の精度を指定します。デフォルトは3です。

  • ActiveSupport::Logger.silencerfalseに設定すると、ブロック内でのログ出力を抑制する機能がオフになります。デフォルト値はtrueです。

  • ActiveSupport::Cache::Store.loggerは、キャッシュストア操作で使用するロガーを指定します。

  • ActiveSupport::Deprecation.behaviorは、config.active_support.deprecationに対するもう一つのセッターであり、Railsの非推奨警告メッセージの表示方法を設定します。

  • ActiveSupport::Deprecation.silenceはブロックを1つ引数に取り、すべての非推奨警告メッセージを抑制します。

  • ActiveSupport::Deprecation.silencedは、非推奨警告メッセージを表示するかどうかを指定します。

3.12 データベースを設定する

ほぼすべてのRailsアプリケーションは、何らかの形でデータベースにアクセスします。データベースへの接続は、環境変数ENV['DATABASE_URL']を設定するか、config/database.ymlというファイルを設定することで行えます。

config/database.ymlファイルを使用することで、データベース接続に必要なすべての情報を指定できます。

development:
  adapter: postgresql
  database: blog_development
  pool: 5

この設定を使用すると、postgresqlを使用して、blog_developmentという名前のデータベースに接続します。同じ接続情報をURL化して、以下のように環境変数に保存することもできます。

> puts ENV['DATABASE_URL']
postgresql://localhost/blog_development?pool=5

config/database.ymlファイルには、Railsがデフォルトで実行できる3つの異なる環境を記述するセクションが含まれています。

  • development環境は、ローカルの開発環境でアプリケーションと手動でやりとりを行うために使用されます。
  • test環境は、自動化されたテストを実行するために使用されます。
  • production環境は、アプリケーションを世界中に公開する本番で使用されます。

必要であれば、config/database.ymlの内部でURLを直接指定することもできます。

development:
  url: postgresql://localhost/blog_development?pool=5

config/database.ymlファイルにはERBタグ<%= %>を含めることができます。タグ内に記載されたものはすべてRubyのコードとして評価されます。このタグを使用して、環境変数から接続情報を取り出したり、接続情報の生成に必要な計算を行なうこともできます。

データベースの接続設定を手動で更新する必要はありません。アプリケーションのジェネレータのオプションを表示してみると、--databaseというオプションがあるのがわかります。このオプションでは、リレーショナルデータベースで最もよく使用されるアダプタをリストから選択できます。さらに、cd .. && rails new blog --database=mysqlのようにするとジェネレータを繰り返し実行することもできます。config/database.ymlファイルが上書きされることを確認すると、アプリケーションの設定はSQLite用からMySQL用に変更されます。よく使用されるデータベース接続方法の詳細な例については、次で説明します。

3.13 接続設定

環境変数を経由してデータベース接続を設定する方法が2とおりあるので、この2つがどのように相互作用するかを理解しておくことが重要です。

config/database.ymlファイルの内容が空で、かつ環境変数ENV['DATABASE_URL']が設定されている場合、データベースへの接続には環境変数が使用されます。

$ cat config/database.yml

$ echo $DATABASE_URL
postgresql://localhost/my_database

config/database.ymlファイルがあり、環境変数ENV['DATABASE_URL']が設定されていない場合は、config/database.ymlファイルを使用してデータベース接続が行われます。

$ cat config/database.yml
development:
  adapter: postgresql
  database: my_database
  host: localhost

$ echo $DATABASE_URL

config/database.ymlファイルと環境変数ENV['DATABASE_URL']が両方存在する場合、両者の設定はマージして使用されます。以下のいくつかの例を参照して理解を深めてください。

提供された接続情報が重複している場合、環境変数が優先されます。

$ cat config/database.yml
development:
  adapter: sqlite3
  database: NOT_my_database
  host: localhost

$ echo $DATABASE_URL
postgresql://localhost/my_database

$ rails runner 'puts ActiveRecord::Base.configurations'
{"development"=>{"adapter"=>"postgresql", "host"=>"localhost", "database"=>"my_database"}}

上の実行結果で使用されている接続情報は、ENV['DATABASE_URL']の内容と一致しています。

提供された複数の情報が重複しておらず、競合している場合も、常に環境変数の接続設定が優先されます。

$ cat config/database.yml
development:
  adapter: sqlite3
  pool: 5

$ echo $DATABASE_URL
postgresql://localhost/my_database

$ rails runner 'puts ActiveRecord::Base.configurations'
{"development"=>{"adapter"=>"postgresql", "host"=>"localhost", "database"=>"my_database", "pool"=>5}}

poolはENV['DATABASE_URL']で提供される情報に含まれていないので、マージされています。adapterは重複しているので、ENV['DATABASE_URL']の接続情報が優先されています。

ENV['DATABASE_URL']の情報よりもdatabase.ymlの情報を優先する唯一の方法は、database.ymlで"url"サブキーを使用して明示的にURL接続を指定することです。

$ cat config/database.yml
development:
  url: sqlite3:NOT_my_database

$ echo $DATABASE_URL
postgresql://localhost/my_database

$ rails runner 'puts ActiveRecord::Base.configurations'
{"development"=>{"adapter"=>"sqlite3", "database"=>"NOT_my_database"}}

今度はENV['DATABASE_URL']の接続情報は無視されました。アダプタとデータベース名が異なります。

config/database.ymlにはERBを記述できるので、database.yml内で明示的にENV['DATABASE_URL']を使用するのが最善の方法です。これは特にproduction環境で有用です。データベース接続のパスワードのような秘密情報をGitなどのソースコントロールに直接登録することは避けなければならないからです。

$ cat config/database.yml
production:
  url: <%= ENV['DATABASE_URL'] %>

以上の説明で動作が明らかになりました。接続情報は絶対にdatabase.ymlに直接書かず、常にENV['DATABASE_URL']に保存したものを利用してください。

3.13.1 SQLite3データベースを設定する

RailsにはSQLite3のサポートがビルトインされています。SQLiteは軽量かつ専用サーバーの不要なデータベースアプリケーションです。SQLiteは開発用・テスト用であれば問題なく使用できますが、本番での使用には耐えられない可能性があります。Railsで新規プロジェクトを作成するとデフォルトでSQLiteが指定されますが、これはいつでも後から変更できます。

以下はデフォルトの接続設定ファイル(config/database.yml)に含まれる、開発環境用の接続設定です。

development:
  adapter: sqlite3
  database: db/development.sqlite3
  pool: 5
  timeout: 5000

Railsでデータ保存用にSQLite3データベースが採用されているのは、設定なしですぐに使用できるからです。RailsではSQLiteに代えてMySQLやPostgreSQLなどを使用することもできます。また、データベース接続用のプラグインが多数あります。production環境で何らかのデータベースを使用する場合、そのためのアダプタはたいていの場合探せば見つかります。

3.13.2 MySQLデータベースを設定する

Rails同梱のSQLite3に代えてMySQLを採用した場合、config/database.ymlの記述方法を少し変更します。developmentセクションの記述は以下のようになります。

development:
  adapter: mysql2
  encoding: utf8
  database: blog_development
  pool: 5
  username: root
  password:
  socket: /tmp/mysql.sock

開発環境のコンピュータにMySQLがインストールされており、ユーザー名root、パスワードなしで接続できるのであれば、上の設定で接続できるようになるはずです。接続できない場合は、developmentセクションのユーザー名またはパスワードを適切なものに変更してください。

3.13.3 PostgreSQLデータベースを設定する

PostgreSQLを採用した場合は、config/database.ymlの記述は以下のようになります。

development:
  adapter: postgresql
  encoding: unicode
  database: blog_development
  pool: 5

PostgreSQLのPrepared Statementsはデフォルトでオンになります。prepared_statementsfalseに設定することでPrepared Statementsをオフにできます。

production:
  adapter: postgresql
  prepared_statements: false

Prepared Statementsをオンにすると、Active Recordはデフォルトでデータベース接続ごとに最大1000までのPrepared Statementsを作成します。この数値を変更したい場合はstatement_limitに別の数値を指定します。

production:
  adapter: postgresql
  statement_limit: 200

Prepared Statementsの使用量の増大は、そのままデータベースで必要なメモリー量の増大につながります。PostgreSQLデータベースのメモリー使用量が上限に達した場合は、statement_limitの値を小さくするかPrepared Statementsをオフにしてください。

3.13.4 JRubyプラットフォームでSQLite3データベースを設定する

JRuby環境でSQLite3を採用する場合、config/database.ymlの記述方法は少し異なります。developmentセクションは以下のようになります。

development:
  adapter: jdbcsqlite3
  database: db/development.sqlite3
3.13.5 JRubyプラットフォームでMySQLデータベースを使用する

JRuby環境でMySQLを採用する場合、config/database.ymlの記述方法は少し異なります。developmentセクションは以下のようになります。

development:
  adapter: jdbcmysql
  database: blog_development
  username: root
  password:
3.13.6 JRubyプラットフォームでPostgreSQLデータベースを使用する

JRuby環境でPostgreSQLを採用する場合、config/database.ymlの記述方法は少し異なります。developmentセクションは以下のようになります。

development:
  adapter: jdbcpostgresql
  encoding: unicode
  database: blog_development
  username: blog
  password:

developmentセクションのユーザー名とパスワードは適切なものに置き換えてください。

3.14 Rails環境を作成する

Railsにデフォルトで備わっている環境は、"development"、"test"、"production"の3つです。通常はこの3つの環境で事足りますが、場合によっては環境を追加したくなることもあると思います。

たとえば、production環境をミラーコピーしたサーバーがあるが、テスト目的でのみ使用したいという場合を想定してみましょう。このようなサーバーは通常「ステージングサーバー(staging server)」と呼ばれます。"staging"環境をサーバーに追加したいのであれば、config/environments/staging.rbというファイルを作成するだけで済みます。その際にはなるべくconfig/environmentsにある既存のファイルを流用し、必要な部分のみを変更するようにしてください。

このようにして追加された環境は、デフォルトの3つの環境と同じように利用できます。rails server -e stagingを実行すればステージング環境でサーバーを起動でき、rails console stagingRails.env.staging?なども動作するようになります。

3.15 サブディレクトリにデプロイする (相対URLルートの使用)

Railsアプリケーションの実行は、アプリケーションのルートディレクトリ(/など)で行なうことが前提となっています。この節では、アプリケーションをディレクトリの下で実行する方法について説明します。

ここでは、アプリケーションを"/app1"ディレクトリにデプロイしたいとします。これを行なうには、適切なルーティングを生成できるディレクトリをRailsに指示する必要があります。

config.relative_url_root = "/app1"

あるいは、RAILS_RELATIVE_URL_ROOT環境変数に設定することもできます。

これで、リンクが生成される時に"/app1"がディレクトリ名の前に追加されます。

3.15.1 Passengerを使用する

Passengerを使用すると、アプリケーションをサブディレクトリで実行するのが容易になります。設定方法の詳細については、passengerマニュアルを参照してください。

3.15.2 リバースプロキシを使用する

TODO

3.15.3 サブディレクトリにデプロイする場合の検討事項

本番環境でRailsをサブディレクトリにデプロイすると、Railsの多くの部分に影響が生じます。

  • 開発環境
  • テスト環境
  • 静的アセットの提供
  • アセットパイプライン

4 Rails環境の設定

一部の設定については、Railsの外部から環境変数を与えることで行なうこともできます。以下の環境変数は、Railsの多くの部分で認識されます。

  • ENV["RAILS_ENV"]は、Railsが実行される環境 (production、development、testなど) を定義します。

  • ENV["RAILS_RELATIVE_URL_ROOT"]は、アプリケーションをサブディレクトリにデプロイするときにルーティングシステムがURLを認識するために使用されます。

  • ENV["RAILS_CACHE_ID"]ENV["RAILS_APP_VERSION"]は、Railsのキャッシュを扱うコードで拡張キャッシュを生成するために使用されます。これにより、ひとつのアプリケーションの中で複数の独立したキャッシュを扱うことができるようになります。

5 イニシャライザファイルを使用する

Railsは、フレームワークの読み込みとすべてのgemの読み込みが終わってから、イニシャライザの読み込みを開始します。イニシャライザとは、アプリケーションのconfig/initializersディレクトリに保存されるRubyファイルのことです。たとえば各部分のオプション設定をイニシャライザに保存しておき、フレームワークとgemがすべて読み込まれた後に適用することができます。

イニシャライザを置くディレクトリにサブフォルダを作ってイニシャライザを整理することもできます。Railsはイニシャライザ用のディレクトリの下のすべての階層を探して実行してくれます。

イニシャライザの実行順序を指定したい場合は、イニシャライザのファイル名を使用して実行順序を制御できます。各フォルダのイニシャライザはアルファベット順に読み込まれます。たとえば01_critical.rbは最初に読み込まれ、02_normal.rbは次に読み込まれます。

6 初期化イベント

Railsにはフック可能な初期化イベントが5つあります。以下に紹介するこれらのイベントは、実際に実行される順序で掲載しています。

  • before_configuration: これはRails::Applicationからアプリケーション定数を継承した直後に実行されます。config呼び出しは、このイベントより前に評価されますので注意してください。

  • before_initialize: これは、:bootstrap_hookイニシャライザを含む初期化プロセスの直前に、直接実行されます。:bootstrap_hookは、Railsアプリケーション初期化プロセスのうち比較的最初の方にあります。

  • to_prepare: これは、Railties用のイニシャライザとアプリケーション自身用のイニシャライザがすべて実行された後、かつ事前一括読み込み(eager loading)の実行とミドルウェアスタックの構築が行われる前に実行されます(訳注: RailtiesはRailsのコアライブラリの1つで、Rails Utilitiesのもじりです)。さらに重要な点は、これはdevelopmentモードではサーバーへのリクエストのたびに必ず実行されますが、productionモードとtestモードでは起動時に1度だけしか実行されないことです。

  • before_eager_load: これは、事前一括読み込みが行われる前に直接実行されます。これはproduction環境ではデフォルトの動作ですが、development環境では異なります。

  • after_initialize: これは、アプリケーションの初期化が終わり、かつconfig/initializers以下のイニシャライザが実行された後に実行されます。

これらのフックのイベントを定義するには、Rails::ApplicationRails::Railtie、またはRails::Engineサブクラス内でブロック記法を使用します。

module YourApp
  class Application < Rails::Application
    config.before_initialize do
      # initialization code goes here
    end
  end
end

あるいは、Rails.applicationオブジェクトに対してconfigメソッドを実行することで行なうこともできます。

Rails.application.config.before_initialize do
  # initialization code goes here
end

アプリケーションの一部、特にルーティング周りでは、after_initializeブロックが呼び出された時点では設定が完了していないものがあります。

6.1 Rails::Railtie#initializer

Railsでは、Rails::Railtieに含まれるinitializerメソッドを使用してすべて定義され、起動時に実行されるイニシャライザがいくつもあります。以下はAction Controllerのset_helpers_pathイニシャライザから取った例です。

initializer "action_controller.set_helpers_path" do |app|
  ActionController::Helpers.helpers_path = app.helpers_paths
end

このinitializerメソッドは3つの引数を取ります。1番目はイニシャライザの名前、2番目はオプションハッシュ(上の例では使ってません)、そして3番目はブロックです。オプションハッシュに含まれる:beforeキーを使用して、新しいイニシャライザより前に実行したいイニシャライザを指定することができます。同様に、:afterキーを使用して、新しいイニシャライザより に実行したいイニシャライザを指定できます。

initializerメソッドを使用して定義されたイニシャライザは、定義された順序で実行されます。ただし:before:afterを使用した場合を除きます。

イニシャライザが起動される順序は、論理的に矛盾が生じない限りにおいて、beforeやafterを使用していかなる順序に変更することもできます。たとえば、"one"から"four"までの4つのイニシャライザがあり、かつこの順序で定義されたとします。ここで"four"を"four"より かつ"three"よりも になるように定義すると論理矛盾が発生し、イニシャライザの実行順を決定できなくなってしまいます。

initializerメソッドのブロック引数は、アプリケーション自身のインスタンスです。そのおかげで、上の例で示したように、configメソッドを使用してアプリケーションの設定にアクセスできます。

実はRails::ApplicationRails::Railtieを間接的に継承しています。そのおかげで、config/application.rbinitializerメソッドを使用してアプリケーション用のイニシャライザを定義できるのです。

6.2 イニシャライザ

Railsにあるイニシャライザのリストを以下にまとめました。これらは定義された順序で並んでおり、特記事項のない限り実行されます。

  • load_environment_hook: これはプレースホルダとして使用されます。具体的には、:load_environment_configを定義してこのイニシャライザより前に実行したい場合に使用します。

  • load_active_support: Active Supportの基本部分を設定するactive_support/dependenciesが必要です。デフォルトのconfig.active_support.bareが信用できない場合にはactive_support/allも必要です。

  • initialize_logger: ここより前の位置でRails.loggerを定義するイニシャライザがない場合、アプリケーションのロガー(ActiveSupport::Loggerオブジェクト)を初期化し、Rails.loggerにアクセスできるようにします。

  • initialize_cache: Rails.cacheが未設定の場合、config.cache_storeの値を参照してキャッシュを初期化し、その結果をRails.cacheとして保存します。そのオブジェクトがmiddlewareメソッドに応答する場合、そのミドルウェアをミドルウェアスタックのRack::Runtimeの前に挿入します。

  • set_clear_dependencies_hook: active_record.set_dispatch_hooksへのフックを提供します。このイニシャライザより前に実行されます。このイニシャライザは、cache_classesfalseの場合にのみ実行されます。そして、このイニシャライザはActionDispatch::Callbacks.afterを使用して、オブジェクト空間からのリクエスト中に参照された定数を削除します。これにより、これらの定数は以後のリクエストで再度読み込まれるようになります。

  • initialize_dependency_mechanism: config.cache_classesがtrueの場合、ActiveSupport::Dependencies.mechanismで依存性を(loadではなく)requireに設定します。

  • bootstrap_hook: このフックはすべての設定済みbefore_initializeブロックを実行します。

  • i18n.callbacks: development環境の場合、to_prepareコールバックを設定します。このコールバックは、最後にリクエストが発生した後にロケールが変更されるとI18n.reload!を呼び出します。productionモードの場合、このコールバックは最初のリクエストでのみ実行されます。

  • active_support.deprecation_behavior: 環境に対する非推奨レポート出力を設定します。development環境ではデフォルトで:log、production環境ではデフォルトで:notify、test環境ではデフォルトで:stderrが指定されます。config.active_support.deprecationに値が設定されていない場合、このイニシャライザは、現在の環境に対応するconfig/environmentsファイルに値を設定するよう促すメッセージを出力します。値の配列を設定することもできます。

  • active_support.initialize_time_zone: config.time_zoneの設定に基いてアプリケーションのデフォルトタイムゾーンを設定します。デフォルト値は"UTC"です。

  • active_support.initialize_beginning_of_week: config.beginning_of_weekの設定に基づいてアプリケーションのデフォルトの週開始日を設定します。デフォルト値は:mondayです。

  • action_dispatch.configure: ActionDispatch::Http::URL.tld_lengthを構成して、config.action_dispatch.tld_lengthの値(トップレベルドメイン名の長さ)が設定されるようにします。

  • action_view.set_configs: config.action_viewの設定を使用してAction Viewを設定します。使用されるconfig.action_viewの設定は、メソッド名がActionView::Baseに対するセッターとしてsendされ、それを経由して値が渡されることによって行われます。

  • action_controller.logger: Rails.loggerに対する設定が行われていない場合にActionController::Base.loggerを設定します。

  • action_controller.initialize_framework_caches: Rails.cacheに対する設定が行われていない場合にActionController::Base.cache_storeを設定します。

  • action_controller.set_configs: config.action_controllerの設定を使用してAction Controllerを設定します。使用されるconfig.action_controllerの設定は、メソッド名がActionController::Baseに対するセッターとしてsendされ、それを経由して値が渡されることによって行われます。

  • action_controller.compile_config_methods: 指定された設定用メソッドを初期化し、より高速にアクセスできるようにします。

  • active_record.initialize_timezone: ActiveRecord::Base.time_zone_aware_attributesをtrueに設定し、ActiveRecord::Base.default_timezoneをUTCに設定します。属性がデータベースから読み込まれた場合、それらの属性はTime.zoneで指定されたタイムゾーンに変換されます。

  • active_record.logger: Rails.loggerに対する設定が行われていない場合にActiveRecord::Base.loggerを設定します。

  • active_record.set_configs: config.active_recordの設定を使用してActive Recordを設定します。使用されるconfig.active_recordの設定は、メソッド名がActiveRecord::Baseに対するセッターとしてsendされ、それを経由して値が渡されることによって行われます。

  • active_record.initialize_database: データベース設定をconfig/database.yml(デフォルトの読み込み元)から読み込み、現在の環境で接続を確立します。

  • active_record.log_runtime: ActiveRecord::Railties::ControllerRuntimeをインクルードします。これは、リクエストでActive Record呼び出しにかかった時間をロガーにレポートする役割を担います。

  • active_record.set_dispatch_hooks: config.cache_classesfalseに設定されている場合、再読み込み可能なデータベース接続をすべてリセットします。

  • action_mailer.logger: Rails.loggerに対する設定が行われていない場合にActionMailer::Base.loggerを設定します。

  • action_mailer.set_configs: config.action_mailerの設定を使用してAction Mailerを設定します。使用されるconfig.action_mailerの設定は、メソッド名がActionMailer::Baseに対するセッターとしてsendされ、それを経由して値が渡されることによって行われます。

  • action_mailer.compile_config_methods: 指定された設定用メソッドを初期化し、より高速にアクセスできるようにします。

  • set_load_path: このイニシャライザはbootstrap_hookより前に実行されます。vendorlibapp以下のすべてのディレクトリ、config.load_pathsで指定されるすべてのパスが$LOAD_PATHに追加されます。

  • set_autoload_paths: このイニシャライザはbootstrap_hookより前に実行されます。app以下のすべてのサブディレクトリと、config.autoload_pathsで指定したすべてのパスがActiveSupport::Dependencies.autoload_pathsに追加されます。

  • add_routing_paths: デフォルトですべてのconfig/routes.rbファイルを読み込み、アプリケーションのルーティングを設定します。このconfig/routes.rbファイルは、アプリケーションだけではなく、エンジンなどのrailtiesにもあります。

  • add_locales: config/localesにあるファイルをI18n.load_pathに追加し、そのパスで指定された場所にある訳文にアクセスできるようにします。このconfig/localesは、アプリケーションだけではなく、railtiesやエンジンにもあります。

  • add_view_paths: アプリケーションやrailtiesやエンジンにあるapp/viewsへのパスをビューファイルへのパスに追加します。

  • load_environment_config: 現在の環境にconfig/environmentsを読み込みます。

  • append_asset_paths: アプリケーションと、それに追加されているrailtiesに含まれているアセットパスを探索し、config.static_asset_pathsで指定されているディレクトリを監視します。

  • prepend_helpers_path: アプリケーションやrailtiesやエンジンに含まれるapp/helpersディレクトリをヘルパーへの参照パスに追加します。

  • load_config_initializers: アプリケーションやrailtiesやエンジンに含まれるconfig/initializersにあるRubyファイルをすべて読み込みます。このディレクトリに置かれているファイルは、フレームワークの読み込みがすべて読み終わってから行いたい設定を保存しておくのにも使用できます。

  • engines_blank_point: エンジンの読み込みが完了する前に行いたい処理がある場合に使用できる初期化ポイントへのフックを提供します。初期化処理がここまで進むと、railtiesやエンジンイニシャライザはすべて起動しています。

  • add_generator_templates: アプリケーションやrailtiesやエンジンにあるlib/templatesディレクトリにあるジェネレータ用のテンプレートを探し、それらをconfig.generators.templates設定に追加します。この設定によって、すべてのジェネレータからテンプレートを参照できるようになります。

  • ensure_autoload_once_paths_as_subset: config.autoload_once_pathsに、config.autoload_paths以外のパスが含まれないようにします。それ以外のパスが含まれている場合は例外が発生します。

  • add_to_prepare_blocks: アプリケーションやrailtiesやエンジンのすべてのconfig.to_prepare呼び出しにおけるブロックが、Action Dispatchのto_prepareに追加されます。Action Dispatchはdevelopmentモードではリクエストごとに実行され、productionモードでは最初のリクエストより前に実行されます。

  • add_builtin_route: アプリケーションがdevelopment環境で動作している場合、rails/info/propertiesへのルーティングをアプリケーションのルーティングに追加します。このルーティングにアクセスすると、デフォルトのRailsアプリケーションでpublic/index.htmlに表示されるのと同様の詳細情報(RailsやRubyのバージョンなど)が表示されます。

  • build_middleware_stack: アプリケーションのミドルウェアスタックを構成し、callメソッドを持つオブジェクトを返します。このcallメソッドは、リクエストに対するRack環境のオブジェクトを引数に取ります。

  • eager_load!: config.eager_loadがtrueに設定されている場合、config.before_eager_loadフックを実行し、続いてeager_load!を呼び出します。この呼び出しにより、すべてのconfig.eager_load_namespacesが呼び出されます。

  • finisher_hook: アプリケーションの初期化プロセス完了後に実行されるフックを提供し、アプリケーションやrailtiesやエンジンのconfig.after_initializeブロックもすべて実行します。

  • set_routes_reloader: ActionDispatch::Callbacks.to_prepareを使用してルーティングを再読み込みするためにAction Dispatchを構成します。

  • disable_dependency_loading: config.eager_loadがtrueの場合は自動依存性読み込み(automatic dependency loading)を無効にします。

7 データベース接続をプールする

Active Recordのデータベース接続はActiveRecord::ConnectionAdapters::ConnectionPoolによって管理されます。これは、接続数に限りのあるデータベース接続にアクセスする際のスレッド数と接続プールが同期するようにするものです。最大接続数はデフォルトで5ですが、database.ymlでカスタマイズ可能です。

development:
  adapter: sqlite3
  database: db/development.sqlite3
  pool: 5
  timeout: 5000

接続プールはデフォルトではActive Recordで取り扱われるため、アプリケーションサーバーの動作は、ThinやmongrelやUnicornなどどれであっても同じ振る舞いになります。最初はデータベース接続のプールは空で、必要に応じて追加接続が作成され、接続プールの上限に達するまで接続が追加されます。

1つのリクエストの中での接続は常に次のような流れになります: 初回はデータベースアクセスの必要な接続を確保し、以後はその接続があることを再確認します。リクエストの終わりでは、キューで待機する次以降のリクエストに備えて接続スロットが追加で利用できるようになります。

利用可能な数よりも多くの接続を使用しようとすると、Active Recordは接続をブロックし、プールからの接続を待ちます。接続が行えなくなると、以下のようなタイムアウトエラーがスローされます。

ActiveRecord::ConnectionTimeoutError - could not obtain a database connection within 5 seconds. The max pool size is currently 5; consider increasing it:

上のエラーが発生するような場合は、database.ymlpoolオプションの数値を増やして接続プールのサイズを増やすことで対応できます。

アプリケーションをマルチスレッド環境で実行している場合、多くのスレッドが多くの接続に同時アクセスする可能性があります。現時点のリクエストの負荷によっては、限られた接続数を多数のスレッドが奪い合うようなことになるかもしれません。