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.time_zone = 'Central Time (US & Canada)'

これは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_classesfalseの場合に影響を受けます。config.cache_classesは、developmentモードではデフォルトでオフです。それ以外の場合、自動読み込みは1度しか行われません。この配列内にあるすべての要素はautoload_pathsに存在しなければなりません。デフォルトは空の配列です。

  • config.autoload_paths: Railsが定数を自動読み込みするパスを含む配列を引数に取ります。config.autoload_pathsのデフォルト値は、app以下のすべてのディレクトリです。この設定の変更は既に非推奨になりました。詳しくは定数の自動読み込みと再読み込みを参照してください。

  • config.add_autoload_paths_to_load_path: $LOAD_PATHにオートロードパスを足すべきかどうかを指定します。このフラグはデフォルトでtrueですが、:zeitwerkモードでは早い段階でconfig/application.rbfalseに設定することをおすすめします。Zeitwerkは内部で絶対パスを用いますし、:zeitwerkモードで動作するアプリケーションではrequire_dependencyが不要なので、モデルやコントローラやジョブなどが$LOAD_PATHに存在する必要はありません。これをfalseに設定すると、requireの解決が相対パスで呼び出されるときにRubyがそれらのディレクトリのチェックを削減でき、Bootsnapの動作やメモリも節約できます。それらのインデックスの構築が不要になるからです。

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

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

  • config.cache_store: Railsでのキャッシュ処理に使われるキャッシュストアを設定します。指定できるオプションは次のシンボル:memory_store:file_store:mem_cache_store:null_storeのいずれか、またはキャッシュAPIを実装するオブジェクトです。デフォルトは:file_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.disable_sandbox: コンソールをsandboxモードで起動してよいかどうかを制御します。これは、sandboxコンソールのセッションを長時間動かしっぱなしにしてデータベースサーバーのメモリがなくなるのを避けるうえで有用です。デフォルトはfalseです。

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

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

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

  • config.enable_dependency_loading: trueの場合、アプリケーションが事前に読み込まれ、config.cache_classesがtrueに設定されていても、自動読み込みを有効にします。 デフォルトはfalseです。

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

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

  • config.debug_exception_response_format: developmentモードで発生したエラーのレスポンスで用いられるフォーマットを設定します。通常のアプリケーションの場合は:defaultが、APIのみの場合は:apiがデフォルトで設定されます。

  • config.file_watcher: config.reload_classes_only_on_changetrueの場合にファイルシステム上のファイル更新検出に使われるクラスを指定します。デフォルトのRailsではActiveSupport::FileUpdateChecker、およびActiveSupport::EventedFileUpdateChecker(これはlistenに依存します)が指定されます。カスタムクラスはこのActiveSupport::FileUpdateChecker APIに従わなければなりません。

  • config.filter_parameters: パスワードやクレジットカード番号など、ログに出力したくないパラメータをフィルタで除外するのに用います。デフォルトのRailsではconfig/initializers/filter_parameter_logging.rbRails.application.config.filter_parameters += [:password]を追加することでパスワードをフィルタで除外します。パラメータのフィルタは正規表現の部分一致によって行われます(訳注: 他のパラメータ名が誤って部分一致しないようご注意ください)。

  • config.force_ssl: ActionDispatch::SSLミドルウェアを用いて、すべてのリクエストをHTTPSプロトコル下で実行するよう強制し、かつconfig.action_mailer.default_url_options{ protocol: 'https' }に設定します。これはconfig.ssl_optionsで設定できます。詳しくはActionDispatch::SSL documentationを参照してください。

  • config.log_formatter: Railsロガーのフォーマットを定義します。このオプションは、デフォルトではすべてのモードでActiveSupport::Logger::SimpleFormatterのインスタンスを使います。config.loggerを設定する場合は、この設定がActiveSupport::TaggedLoggingインスタンスでラップされるより前の段階で、フォーマッターの値を手動で渡さなければなりません。Railsはこの処理を自動では行いません。

  • config.log_level: Railsのログ出力をどのぐらい詳細にするかを指定します。デフォルトではすべての環境で:debugが指定されます。指定可能な出力レベルは:debug:info:warn:error:fatal:unknownです。

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

  • config.logger: Rails.loggerで使われるロガーやRails関連のあらゆるログ出力(ActiveRecord::Base.loggerなど)を指定します。デフォルトでは、ActiveSupport::LoggerのインスタンスをラップするActiveSupport::TaggedLoggingのインスタンスが指定されます。なおActiveSupport::Loggerはログをlog/ディレクトリに出力します。ここにカスタムロガーを指定できますが、互換性を完全にするには以下のガイドラインに従わなければなりません。

  • フォーマッターをサポートする場合は、config.log_formatterの値を手動でロガーに代入しなければなりません。

  • タグ付きログをサポートする場合は、そのログのインスタンスをActiveSupport::TaggedLoggingでラップしなければなりません。

  • ログ出力の抑制をサポートするには、LoggerSilenceモジュールとActiveSupport::LoggerThreadSafeLevelincludeしなければなりません。ActiveSupport::Loggerクラスは既にこれらのモジュールにincludeされています。

class MyLogger < ::Logger
  include ActiveSupport::LoggerThreadSafeLevel
  include LoggerSilence
end
mylogger           = MyLogger.new(STDOUT)
mylogger.formatter = config.log_formatter
config.logger      = ActiveSupport::TaggedLogging.new(mylogger)
  • config.middleware: アプリケーションで使うミドルウェアをカスタマイズできます。詳細についてはミドルウェアを設定するの節を参照してください。

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

  • config.credentials.content_path: 暗号化済みcredentialの探索パスを設定します。

  • config.credentials.key_path 暗号化キーの探索パスを設定します。

  • secret_key_base: このメソッドは、改竄防止のためにアプリケーションのセッションを既知の秘密キーと照合するためのキーを指定するときに使います。test環境とdevelopment環境の場合、secrets.secret_key_baseでランダムに生成されたキーを使います。その他の環境ではキーをconfig/credentials.yml.encに設定すべきです。

  • config.public_file_server.enabled: public/ディレクトリ内の静的アセットを扱うかどうかを指定します。デフォルトではtrueが設定されますが、production環境ではアプリケーションを実行するNginxやApacheなどのサーバーが静的アセットを扱う必要があるので、falseになります。デフォルトの設定とは異なり、WEBrickをでアプリケーションをproductionモードで実行したり(WEBrickをproductionで使うことは推奨されません)テストしたりする場合はtrueに設定します。そうしないとページキャッシュが利用できなくなり、public/ディレクトリ以下に常駐する静的ファイルへのリクエストも有効になりません。

  • config.session_store: セッションの保存に使うクラスを指定します。指定できる値は:cookie_store(デフォルト)、:mem_cache_store:disabledです。:disabledを指定すると、Railsでセッションが扱われなくなります。デフォルトでは、アプリケーション名と同じ名前のcookieストアがセッションキーとして使われます。カスタムセッションストアを指定することもできます。

    config.session_store :my_custom_store
    

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

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

  • config.autoloader: オートローディングモードを設定します。config.load_defaults6.0が指定されている場合、このオプションはデフォルトで:zeitwerkになります。フレームワークのデフォルトが読み込まれた後にこの値を:classicに設定することで、クラシックオートローダーを引き続きアプリケーションで利用できます。

    config.load_defaults "6.0"
    config.autoloader = :classic
    

3.2 アセットを設定する

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

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

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

  • config.assets.gzip: gzipされていない版の作成に加えて、コンパイル済みアセットのgzip版作成も有効にするかどうかを指定するフラグです。デフォルトはtrueです。

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

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

  • config.assets.unknown_asset_fallback: アセットがパイプラインにない場合のアセットパイプラインの挙動の変更に使います(sprockets-rails 3.2.0以降を使う場合)。デフォルトはtrueです。

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

  • config.assets.manifest: アセットプリコンパイラのマニフェストファイルで使うフルパスを定義します。デフォルトでは、config.assets.prefixで指定されたpublic/フォルダ内にあるmanifest-<ランダム>.jsonという名前のファイルになります。

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

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

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

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

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

  • config.assets.quiet: アセットへのリクエストのログ出力を無効にします。デフォルトではdevelopment.rbtrueに設定されます。

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: 結合テストの生成に使う統合ツールを定義します。デフォルトは:test_unitです。
  • system_tests: システムテスト生成に用いる統合ツールを定義します。デフォルトは:test_unitです。∂ç
  • orm: 使うORM (オブジェクトリレーショナルマッピング) を指定します。デフォルトはfalseであり、この場合はActive Recordが使われます。
  • resource_controller: rails generate resourceの実行時にどのジェネレータでコントローラを生成するかを指定します。デフォルトは:controllerです。
  • resource_route: リソースのルーティング定義を生成すべきかどうかを定義します。デフォルトはtrueです。
  • scaffold_controller: resource_controllerと同じではありません。scaffold_controller: scaffoldでどのジェネレータでコントローラを生成するか(rails generate scaffoldの実行時)を指定します。デフォルトは:scaffold_controllerです。
  • stylesheets: ジェネレータでスタイルシートのフックを行なうかどうかを指定します。この設定はscaffoldジェネレータの実行時に使われますが、このフックは他のジェネレータでも使われます。デフォルトはtrueです。
  • stylesheet_engine: アセット生成時に使われる、sassなどのスタイルシートエンジンを指定します。デフォルトは:cssです。
  • scaffold_stylesheet: scaffoldされたリソースを生成するときにscaffold.cssを作成するかどうかを指定します。デフォルトはtrueです。
  • test_framework: 利用するテストフレームワークを指定します。デフォルトはfalseであり、この場合Minitestが使われます。
  • template_engine: ビューのテンプレートエンジン(ERBやHamlなど)を指定します。デフォルトは:erbです。

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

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

  • ActionDispatch::SSL: すべてのリクエストにHTTPSプロトコルを強制します。これはconfig.force_ssltrueにすると有効になります。渡すオプションはconfig.ssl_optionsで設定できます。
  • ActionDispatch::Static: 静的アセットを扱うために使います。config.public_file_server.enabledfalseの場合は無効に設定されます。静的ディレクトリのインデックスファイルがindexでない場合には、config.public_file_server.index_nameを設定します。たとえば、ディレクトリへのリクエストをindex.htmlではなくmain.htmlと扱うには、config.public_file_server.index_name"main"に設定します。
  • ActionDispatch::Executor: スレッドセーフなコード再読み込みに使います。これはconfig.allow_concurrencyfalseの場合に無効になり、Rack::Lockが読み込まれるようになります。Rack::Lockはアプリケーションのミューテックスをラップするので、同時に1つのスレッドでしか呼び出されなくなります。
  • ActiveSupport::Cache::Strategy::LocalCache: 基本的なメモリバックアップ式キャッシュとして機能します。このキャッシュはスレッドセーフではなく、単一スレッド用の一時メモリキャッシュとして機能することのみを意図していることにご注意ください。
  • Rack::Runtime: X-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: リクエストに応答する前に、事前コールバックを実行します。
  • ActionDispatch::Cookies: リクエストに対応するcookieを設定します。
  • ActionDispatch::Session::CookieStore: セッションをcookieに保存する役割を担います。config.action_controller.session_storeの値を変更すると別のミドルウェアを使えます。これに渡されるオプションはconfig.action_controller.session_optionsで設定できます。
  • ActionDispatch::Flash: flashキーを設定します。これは、config.action_controller.session_storeに値が設定されている場合にのみ有効です。
  • Rack::MethodOverride: params[:_method]が設定されている場合にメソッドを上書きできるようにします。これは、HTTPでPATCH、PUT、DELETEメソッドを使えるようにするミドルウェアです。
  • Rack::Head: HEADリクエストをGETリクエストに変換し、HEADリクエストが機能するようにします。

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

config.middleware.use Magical::Unicorns

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

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

ミドルウェアはインデックスを用いて該当箇所に正確に挿入することもできます。たとえば、Magical::Unicornsミドルウェアをスタックの最上位に挿入するには次のように設定します。

config.middleware.insert_before 0, 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}です。

  • config.i18n.fallbacks: 訳文がない場合のフォールバック動作を設定します。ここではオプションの3つの使い方を説明します。

    • デフォルトのロケールをフォールバック先として使う場合は次のようにtrueを設定します。
     config.i18n.fallbacks = true
    
    • ロケールの配列をフォールバック先に使う場合は次のようにします。
     config.i18n.fallbacks = [:tr, :en]
    
    • ロケールごとに個別のフォールバックを設定することもできます。たとえば:az:trを、:da:de:enをそれぞれフォールバック先として指定する場合は、次のようにします。
     config.i18n.fallbacks = { az: :tr, da: [:de, :en] }
     #or
     config.i18n.fallbacks.map = { az: :tr, da: [:de, :en] }
    

3.6 Active Modelを設定する

  • config.active_model.i18n_customize_full_message: full_messageエラーフォーマットを属性レベルやモデルレベルでロケールファイルで上書きしてよいかどうかを制御するboolean値です。デフォルトはfalseです。

3.7 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.internal_metadata_table_name: 内部のメタテーブル名として用いられる文字列を設定できます。

  • config.active_record.protected_environments: 破壊的操作を禁止すべき環境名を配列で設定できます。

  • 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.error_on_ignored_order: バッチクエリの実行中にクエリの順序が無視された場合にエラーをraiseすべきかどうかを指定します。オプションはtrue(エラーをraise)またはfalse(警告)で、デフォルトはfalseです。

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

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

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

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

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

  • 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が指定されます。

  • config.active_record.dump_schemas: db:structure:dumpの呼び出し時にデータベーススキーマをダンプするかどうかを指定します。使えるオプションは、:schema_search_path(デフォルト、schema_search_path内のすべてのスキーマをダンプ)、:allschema_search_pathと無関係にすべてのスキーマをダンプ)、またはカンマ区切りのスキーマの文字列です。

  • config.active_record.belongs_to_required_by_default: belongs_to関連付けが存在しない場合にレコードのバリデーションを失敗させるかどうかをbooleanで指定します。

  • config.active_record.warn_on_records_fetched_greater_than: クエリ結果のサイズで警告を出す場合のスレッショルドを設定します。あるクエリから返されるレコード数がこのスレッショルドを超えると、警告がログに出力されます。これは、メモリ肥大化の原因となっている可能性のあるクエリを特定するのに利用できます。

  • config.active_record.index_nested_attribute_errors: ネストしたhas_many関連付けのエラーをインデックス付きでエラー表示するかどうかを指定します。デフォルトはfalseです。

  • config.active_record.use_schema_cache_dump: (bin/rails db:schema:cache:dumpで生成された)db/schema_cache.ymlのスキーマ情報を、データベースにクエリを送信しなくてもユーザーが取得できるようにするかどうかを指定します。デフォルトはtrueです。

  • config.active_record.collection_cache_versioning: ActiveRecord::Relation型でキャッシュされたオブジェクトが、そのリレーションのキャッシュキーの揮発性の情報(updated atとcountの最大値)をキャッシュキーの再利用サポートのためにキャッシュバージョンに移動したときに、同じキャッシュキーを再利用できるようにします。デフォルトはfalseです。

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

  • ActiveRecord::ConnectionAdapters::Mysql2Adapter.emulate_booleans: Active Recordがすべてのtinyint(1)カラムをデフォルトでbooleanと認識するかどうかを指定します。デフォルトはtrueです。

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

  • ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.create_unlogged_tables: 作成されたデータベースを「unlogged」にすべきかどうかを制御します。unloggedにするとパフォーマンスは向上しますが、データベースがクラッシュしたときのデータ喪失リスクも増加します。production環境ではこれを有効にしないことを強くおすすめします。デフォルトではすべての環境でfalseになります。

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

  • ActiveRecord::SchemaDumper.ignore_tables: テーブル名の配列を1つ引数に取ります。どのスキーマファイルにも含まれてはならないテーブル名がある場合はこの配列にテーブル名を含めます。

  • ActiveRecord::SchemaDumper.fk_ignore_pattern: 外部キー名をdb/schema.rbにダンプすべきかどうかを指定する正規表現を別のものに設定できます。デフォルトでは、fk_rails_で始まる外部キー名はデータベースのスキーマダンプにエクスポートされません。デフォルトは/^fk_rails_[0-9a-f]{10}$/です。

3.8 Action Controllerを設定する

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

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

  • config.action_controller.perform_caching: Action Controllerコンポーネントが提供するキャッシュ機能をアプリケーションで使うかどうかを指定します。developmentモードではfalse、productionモードではtrueに設定します。指定のない場合はtrueになります。

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

  • config.action_controller.include_all_helpers: すべてのビューヘルパーをあらゆる場所で使えるようにするか、対応するコントローラのスコープに限定するかを設定します。falseに設定すると、たとえばUsersHelperUsersControllerの一部としてレンダリングされるビューでしか使えなくなります。trueに設定すると、このUsersHelperはどこからでも使えるようになります。デフォルト設定の振る舞い(このオプションにtruefalseが明示的に設定されていない場合)は、どのコントローラでもあらゆるビューヘルパーが使えるようになります。

  • 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.forgery_protection_origin_check: CSRFの追加対策としてHTTPのOriginヘッダーがサイトのoriginと合っていることをチェックすべきかどうかを設定します。

  • config.action_controller.per_form_csrf_tokens: CSRFトークンの正当性をそれらが生成されたメソッドやアクションに対してのみ認めるかどうかを設定します。

  • config.action_controller.default_protect_from_forgery: フォージェリ対策をActionController:Baseに追加するかどうかを指定します。これはデフォルトではfalseですが、Rails 5.2ではデフォルト設定を読み込むと有効になります。

  • 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が設定されます。

  • config.action_controller.always_permitted_parameters: デフォルトで許可されるホワイトリストパラメータのリストを設定します。デフォルト値は ['controller', 'action']です。

  • config.action_controller.enable_fragment_cache_logging: フラグメントキャッシュの読み書きのログを次のようにverbose形式で出力するかどうかを指定します。

Read fragment views/v1/2914079/v1/2914079/recordings/70182313-20160225015037000000/d0bdf2974e1ef6d31685c3b392ad0b74 (0.6ms)
Rendered messages/_message.html.erb in 1.2 ms [cache hit]
Write fragment views/v1/2914079/v1/2914079/recordings/70182313-20160225015037000000/3b4e249ac9d168c617e32e84b99218b5 (1.1ms)
Rendered recordings/threads/_thread.html.erb in 1.5 ms [cache miss]

デフォルトはfalseで、以下のように出力されます。

Rendered messages/_message.html.erb in 1.2 ms [cache hit]
Rendered recordings/threads/_thread.html.erb in 1.5 ms [cache miss]

3.9 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',
      'X-Download-Options' => 'noopen',
      'X-Permitted-Cross-Domain-Policies' => 'none',
      'Referrer-Policy' => 'strict-origin-when-cross-origin'
    }
    
  • config.action_dispatch.default_charset: すべてのレンダリングで使うデフォルトの文字セットを指定します。デフォルトはnilです。

  • config.action_dispatch.tld_length: アプリケーションで使うトップレベルドメイン(TLD) の長さを指定します。デフォルトは1です。

  • config.action_dispatch.ignore_accept_header: リクエストのヘッダーを受け付けるかどうかを指定します。デフォルトはfalseです。

  • config.action_dispatch.x_sendfile_header: サーバー固有のX-Sendfileヘッダーを指定します。これは、サーバーからの送信を加速するのに有用です。たとえば、'X-Sendfile'をApache向けに設定できます。

  • 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.authenticated_encrypted_cookie_salt: 認証された暗号化済みcookieのsalt値を設定します。デフォルトは'authenticated encrypted cookie'です。

  • config.action_dispatch.encrypted_cookie_cipher: 暗号化済みcookieに使う暗号化方式を設定します。デフォルトは"aes-256-gcm"です。

  • config.action_dispatch.signed_cookie_digest: 署名済みcookieに使うダイジェスト方式を設定します。デフォルトは"SHA1"です。

  • config.action_dispatch.cookies_rotations: 署名暗号化済みcookieの秘密情報、暗号化方式、ダイジェスト方式のローテーションを行います。

  • config.action_dispatch.use_authenticated_cookie_encryption: 署名暗号化済みcookieが値の期限切れ情報に埋め込まれる場合に、暗号化済みcookieでAES-256-GCで認証された暗号を用いるようになります。デフォルトはfalseです。

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

  • config.action_dispatch.rescue_responses: HTTPステータスに割り当てる例外を設定します。ここには、例外とステータスのさまざまなペアを指定したハッシュを1つ指定可能です。デフォルトの定義は次のようになっています。

config.action_dispatch.rescue_responses = {
  'ActionController::RoutingError'               => :not_found,
  'AbstractController::ActionNotFound'           => :not_found,
  'ActionController::MethodNotAllowed'           => :method_not_allowed,
  'ActionController::UnknownHttpMethod'          => :method_not_allowed,
  'ActionController::NotImplemented'             => :not_implemented,
  'ActionController::UnknownFormat'              => :not_acceptable,
  'ActionController::InvalidAuthenticityToken'   => :unprocessable_entity,
  'ActionController::InvalidCrossOriginRequest'  => :unprocessable_entity,
  'ActionDispatch::Http::Parameters::ParseError' => :bad_request,
  'ActionController::BadRequest'                 => :bad_request,
  'ActionController::ParameterMissing'           => :bad_request,
  'Rack::QueryParser::ParameterTypeError'        => :bad_request,
  'Rack::QueryParser::InvalidParameterError'     => :bad_request,
  'ActiveRecord::RecordNotFound'                 => :not_found,
  'ActiveRecord::StaleObjectError'               => :conflict,
  'ActiveRecord::RecordInvalid'                  => :unprocessable_entity,
  'ActiveRecord::RecordNotSaved'                 => :unprocessable_entity
}

設定されていない例外はすべて500 Internel Server Errorに割り当てられます。

  • config.action_dispatch.return_only_media_type_on_content_type: ActionDispatch::Response#content_typeがContent-Typeヘッダーを改変なしで返すよう変更します。デフォルト値はfalseです。

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

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

3.10 Action Viewを設定する

config.action_viewにも若干の設定があります。

  • config.action_view.cache_template_loading: リクエストのたびにビューテンプレートを再読み込みするか(=キャッシュしないか)を指定します。config.action_view.cache_template_loadingのデフォルト値はconfig.cache_classesがtrueならtrue、falseならfalseとして設定されます。

  • config.action_view.field_error_proc: Active Modelで発生したエラーの表示に使う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で訳文が見つからない場合にエラーを発生するかどうかを指定します。デフォルトはfalseです。

  • config.action_view.automatically_disable_submit_tag: クリック時にsubmit_tagを自動的に無効にするべきかどうかを指定します。デフォルトはtrueです。

  • config.action_view.debug_missing_translation: 訳文の存在しないキーを<span>タグで囲むかどうかを指定します。デフォルトはtrueです。

  • config.action_view.form_with_generates_remote_forms: form_withでリモートフォームを生成するかどうかを指定します。デフォルトはtrueです。

  • config.action_view.form_with_generates_ids: form_withでidを生成するかどうかを指定します。デフォルトはfalseです。

  • config.action_view.default_enforce_utf8: UTF-8でエンコードされたフォームを古いInternet Explorerで強制送信する隠しタグ付きでフォームを生成するかどうかを指定します。デフォルトはfalseです。

3.11 Action Mailboxを設定する

config.action_mailboxには以下の設定オプションがあります。

  • config.action_mailbox.logger: Action Mailboxで用いるロガーを含みます。Log4rまたはデフォルトのRuby Loggerクラスに従うロガーを渡せます。デフォルトはRails.loggerです。
  config.action_mailbox.logger = ActiveSupport::Logger.new(STDOUT)
  • config.action_mailbox.incinerate_after: ActiveSupport::Durationを受け取ります。これはActionMailbox::InboundEmailレコードを処理後に破棄(destroy)すべき期間を指定します。デフォルトは30.daysです。
   # 受信メールの処理後、14日後に焼却する
   config.action_mailbox.incinerate_after = 14.days
  • config.action_mailbox.queues.incineration: 焼却(incinerate)ジョブに用いるActive Jobキューを示すシンボルを渡せます。デフォルトは:action_mailbox_incinerationです。

  • config.action_mailbox.queues.routing: ルーティングジョブに用いるActive Jobキューを示すシンボルを渡せます。デフォルトは:action_mailbox_routingです。

3.12 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のいずれかのシンボルを指定できます。
    • :enable_starttls_auto: 利用するSMTPサーバーでSTARTTLSが有効かどうかを検出し、可能な場合は使います。デフォルトはtrueです。
    • :openssl_verify_mode: TLSを使う場合、OpenSSLの認証方法を設定できます。これは、自己署名証明書やワイルドカード証明書が必要な場合に便利です。OpenSSLの検証定数である:none:peerを指定することも、OpenSSL::SSL::VERIFY_NONE定数やOpenSSL::SSL::VERIFY_PEER定数を直接指定することもできます。
    • :ssl/:tls: SMTP接続でSMTP/TLS(SMTPS: SMTP over direct TLS connection)を有効にします。
  • config.action_mailer.sendmail_settings: :sendmail配信方法を詳細に設定するのに使えます。これはオプションのハッシュを引数に取り、以下のどのオプションでも含めることができます。

    • :location - sendmail実行ファイルの場所。デフォルトは/usr/sbin/sendmailです。
    • :arguments - コマンドラインに与える引数。デフォルトは-iです。
  • 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"]
    
  • config.action_mailer.preview_path: メイラーのプレビュー場所を指定します

    config.action_mailer.preview_path = "#{Rails.root}/lib/mailer_previews"
    
  • config.action_mailer.show_previews: メイラーのプレビューを有効または無効にします。デフォルトではdevelopment環境でtrueです。

    config.action_mailer.show_previews = false
    
  • config.action_mailer.deliver_later_queue_name: メイラーで使うキュー名を指定します。デフォルトはmailersです。

  • config.action_mailer.perform_caching: メイラーのテンプレートでフラグメントキャッシュを有効にするべきかどうかを指定します。指定のない場合のデフォルト値はtrueです。

  • config.action_mailer.delivery_job: メールの配信ジョブを指定します。デフォルトはActionMailer::DeliveryJobです。

3.13 Active Supportを設定する

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

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

  • config.active_support.test_order: テストケースの実行順序を指定します。:random:sortedを指定可能で、デフォルトは:randomです。

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

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

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

  • config.active_support.use_sha1_digests: 重要でないダイジェスト(ETagヘッダーなど)の生成にMD5ではなくSHA-1を使うかどうかを指定します。デフォルトはfalseです。

  • config.active_support.use_authenticated_message_encryption: AES-256-CBCではなくAES-256-GCM認証済み暗号をデフォルトのメッセージ暗号化に用いるかどうかを指定します。デフォルトはfalseです。

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

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

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

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

  • ActiveSupport::Deprecation.silenced: 非推奨警告メッセージを表示するかどうかを指定します。デフォルトはfalseです。

3.14 Active Jobを設定する

config.active_jobでは以下の設定オプションが利用できます。

  • config.active_job.queue_adapter: キューのバックエンドに用いるアダプタを設定します。デフォルトのアダプタは:asyncです。最新の組み込みアダプタについてはActiveJob::QueueAdapters API documentationを参照してください。

    # 必ずGemfileにアダプタのgemを追加し、
    # アダプタ固有のインストール/デプロイ方法に従うこと
    config.active_job.queue_adapter = :sidekiq
    
  • config.active_job.default_queue_name: デフォルトのキュー名を変更できます。デフォルトは"default"です。

    config.active_job.default_queue_name = :medium_priority
    
  • config.active_job.queue_name_prefix: すべてのジョブ名の前に付けられるプレフィックスを設定します(スペースは含めません)。デフォルトは空欄なので何も追加されません。

以下の設定では、production実行時に指定のジョブがproduction_high_priorityキューに送信されます。

```ruby
config.active_job.queue_name_prefix = Rails.env
```

```ruby
class GuestsCleanupJob < ActiveJob::Base
  queue_as :high_priority
  #....
end
```
  • config.active_job.queue_name_delimiter: デフォルト値は'_'です。queue_name_prefixが設定されている場合は、キュー名とプレフィックスの結合にqueue_name_delimiterが使われます。

以下の設定では、指定のジョブがvideo_server.low_priorityキューに送信されます。

```ruby
# この区切り文字を使うにはprefixを設定しなければならない
config.active_job.queue_name_prefix = 'video_server'
config.active_job.queue_name_delimiter = '.'
```

```ruby
class EncoderJob < ActiveJob::Base
  queue_as :low_priority
  #....
end
```
  • config.active_job.logger: Active Jobのログ情報に使うロガーとして、Log4rのインターフェイスに準拠したロガーか、デフォルトのRubyロガーを指定できます。このロガーは、Active JobのクラスかActive Jobのインスタンスでloggerを呼び出すことで取り出せます。ログ出力を無効にするにはnilを設定します。

  • config.active_job.custom_serializers: カスタムの引数シリアライザを設定できます。デフォルトは[]です。

  • config.active_job.return_false_on_aborted_enqueue: キューの投入がabortされた場合に、#enqueueがジョブのインスタンスではなくfalseを返すよう変更します。デフォルトはfalseです。

3.15 Action Cableを設定する

  • config.action_cable.url: Action CableサーバーがホストされているURLの文字列を指定します。Action Cableサーバーがメインのアプリケーションと別になっている場合に使う可能性があります。
  • config.action_cable.mount_path: Action Cableをメインサーバープロセスの一部としてマウントする場所を文字列で指定します。デフォルトは/cableです。nilを設定すると、Action Cableは通常のRailsサーバーの一部としてマウントされなくなります。

設定オプションについて詳しくは、Action Cableの概要を参照してください。

3.16 Active Storageを設定する

config.active_storageでは以下の設定オプションが提供されています。

  • config.active_storage.variant_processor: :mini_magickまたは:vipsいずれかのシンボルを渡せます。これらはvariantの変換にMiniMagickとruby-vipsのどちらを使うかを指定します。デフォルトは:mini_magickです。

  • config.active_storage.analyzers: Active Storageのblob(binary large object)で利用できるアナライザを指定するクラスの配列を受け取ります。デフォルトは[ActiveStorage::Analyzer::ImageAnalyzer, ActiveStorage::Analyzer::VideoAnalyzer]です。前者は画像blobの幅(width)や高さ(height)の取り出し、後者は動画blobの幅(width)、高さ(height)、再生時間(duration)、角度(angle)、アスペクト比(aspect ratio)の取り出しに利用できます。

  • config.active_storage.previewers: Active Storageのblobで利用できる画像プレビューアを指定するクラスの配列を受け取ります。デフォルトは[ActiveStorage::Previewer::PDFPreviewer, ActiveStorage::Previewer::VideoPreviewer]です。前者はPDF blobの最初のページのサムネイルを、後者は動画blobのフレームの中から内容を代表するフレームをそれぞれ生成できます。

  • config.active_storage.paths: プレビューアやアナライザのコマンドがあるディレクトリを示すオプションのハッシュを受け取ります。デフォルトの{}の場合、コマンドをデフォルトパスで探索します。オプションには以下を含められます。

    • :ffprobe: ffprobe実行ファイルの場所
    • :mutool: mutool実行ファイルの場所
    • :ffmpeg: ffmpeg実行ファイルの場所
   config.active_storage.paths[:ffprobe] = '/usr/local/bin/ffprobe'
  • config.active_storage.variable_content_types: Active StorageがImageMagickに変換可能なcontent typeを示す文字列の配列を受け取ります。デフォルトは%w(image/png image/gif image/jpg image/jpeg image/vnd.adobe.photoshop)です。

  • config.active_storage.content_types_to_serve_as_binary: Active Storageが常に添付ファイルとして扱うcontent typeを示す文字列の配列を受け取ります。デフォルトは%w(text/html text/javascript image/svg+xml application/postscript application/x-shockwave-flash text/xml application/xml application/xhtml+xml)です。

  • config.active_storage.queues.analysis: 解析ジョブに用いるActive Jobキューをシンボルで指定します。このオプションがnilの場合、解析ジョブはデフォルトのActive Jobキューに送信されます(config.active_job.default_queue_nameを参照)。

  config.active_job.queue = :low_priority
  • config.active_storage.queues.purge: purgeジョブに用いるActive Jobキューをシンボルで指定します。このオプションがnilの場合、purgeジョブはデフォルトのActive Jobキューに送信されます(config.active_job.default_queue_nameを参照)。
  config.active_storage.queues.purge = :low_priority
  • config.active_storage.logger: Active Storageで用いられるロガーを設定するのに利用できます。Log4rのインターフェイスに沿ったロガーや、デフォルトのRuby Loggerクラスを指定できます。
  config.active_job.logger = ActiveSupport::Logger.new(STDOUT)
  • config.active_storage.service_urls_expire_in: 以下によって生成されるURLのデフォルトの期限を指定します。
    • ActiveStorage::Blob#service_url
    • ActiveStorage::Blob#service_url_for_direct_upload
    • ActiveStorage::Variant#service_url

デフォルトは5分です。

  • config.active_storage.routes_prefix: Active Storageでサービスするルーティングのプレフィックスを設定できます。生成されるルーティングの冒頭に追加する文字列を渡せます。
  config.active_storage.routes_prefix = '/files'

デフォルトは/rails/active_storageです。

  • config.active_storage.replace_on_assign_to_many: has_many_attachedで宣言された添付ファイルのコレクションに代入したときに、既存の添付ファイルをすべて置き換えるか、追加(append)するかを指定します。デフォルトはtrueです。

3.17 load_defaultsの結果

3.17.1 '5.0'を指定した場合
  • config.action_controller.per_form_csrf_tokens: true
  • config.action_controller.forgery_protection_origin_check: true
  • ActiveSupport.to_time_preserves_timezone: true
  • config.active_record.belongs_to_required_by_default: true
  • config.ssl_options: { hsts: { subdomains: true } }
3.17.2 '5.1'を指定した場合
  • config.assets.unknown_asset_fallback: false
  • config.action_view.form_with_generates_remote_forms: true
3.17.3 '5.2'を指定した場合
  • config.active_record.cache_versioning: true
  • action_dispatch.use_authenticated_cookie_encryption: true
  • config.active_support.use_authenticated_message_encryption: true
  • config.active_support.use_sha1_digests: true
  • config.action_controller.default_protect_from_forgery: true
  • config.action_view.form_with_generates_ids: true
3.17.4 '6.0'を指定した場合
  • config.autoloader: :zeitwerk
  • config.action_view.default_enforce_utf8: false
  • config.action_dispatch.use_cookies_with_metadata: true
  • config.action_dispatch.return_only_media_type_on_content_type: false
  • config.action_mailer.delivery_job: "ActionMailer::MailDeliveryJob"
  • config.active_job.return_false_on_aborted_enqueue: true
  • config.active_storage.queues.analysis: :active_storage_analysis
  • config.active_storage.queues.purge: :active_storage_purge
  • config.active_storage.replace_on_assign_to_many: true
  • config.active_record.collection_cache_versioning: true

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

ほぼすべての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.19 接続設定

データベース接続の設定方法はconfig/database.ymlによる方法と環境変数による方法の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'
#<ActiveRecord::DatabaseConfigurations:0x00007fd50e209a28>

$ rails runner 'puts ActiveRecord::Base.configurations.inspect'
#<ActiveRecord::DatabaseConfigurations:0x00007fc8eab02880 @configurations=[
  #<ActiveRecord::DatabaseConfigurations::UrlConfig:0x00007fc8eab020b0
    @env_name="development", @spec_name="primary",
    @config={"adapter"=>"postgresql", "database"=>"my_database", "host"=>"localhost"}
    @url="postgresql://localhost/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'
#<ActiveRecord::DatabaseConfigurations:0x00007fd50e209a28>

$ rails runner 'puts ActiveRecord::Base.configurations.inspect'
#<ActiveRecord::DatabaseConfigurations:0x00007fc8eab02880 @configurations=[
  #<ActiveRecord::DatabaseConfigurations::UrlConfig:0x00007fc8eab020b0
    @env_name="development", @spec_name="primary",
    @config={"adapter"=>"postgresql", "database"=>"my_database", "host"=>"localhost", "pool"=>5}
    @url="postgresql://localhost/my_database">
  ]

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'
#<ActiveRecord::DatabaseConfigurations:0x00007fd50e209a28>

$ rails runner 'puts ActiveRecord::Base.configurations.inspect'
#<ActiveRecord::DatabaseConfigurations:0x00007fc8eab02880 @configurations=[
  #<ActiveRecord::DatabaseConfigurations::UrlConfig:0x00007fc8eab020b0
    @env_name="development", @spec_name="primary",
    @config={"adapter"=>"sqlite3", "database"=>"NOT_my_database"}
    @url="sqlite3: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.19.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(MariaDB含む)やPostgreSQLなども使えますし、データベース接続用のプラグインも多数あります。production環境で何らかのデータベースを使う場合、そのためのアダプタはたいていの場合探せば見つかります。

3.19.2 MySQLやMariaDBデータベースを設定する

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

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

ユーザー名root、パスワードなしでdevelopment環境のデータベースに接続できれば、上の設定で接続できるはずです。接続できない場合は、developmentセクションのユーザー名またはパスワードを適切なものに変更してください。

MySQLのバージョンが5.5または5.6で、かつutf8mb4文字セットをデフォルトで使いたい場合は、MySQLサーバーでinnodb_large_prefixシステム変数を有効にすることで、長いキープレフィックスがサポートされるよう設定してください。

MySQLのAdvisory Locksはデフォルトで有効になります。これはデータベースマイグレーションをコンカレンシー安全にするために用いられます。advisory_locksfalseにするとAdvisory Locksを無効にできます。

production:
  adapter: mysql2
  advisory_locks: false
3.19.3 PostgreSQLデータベースを設定する

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

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

Active Recordでは、Prepared StatementsやAdvisory Locksなどの機能がデフォルトでオンになります。PgBouncerなどの外部コネクションプーラーを用いる場合、これらの機能をオフにできます。

production:
  adapter: postgresql
  prepared_statements: false
  advisory_locks: false

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

production:
  adapter: postgresql
  statement_limit: 200

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

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

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

development:
  adapter: jdbcsqlite3
  database: db/development.sqlite3
3.19.5 JRubyプラットフォームでMySQLやMariaDBのデータベースを使う

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

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

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

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

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

3.20 Rails環境を作成する

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

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

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

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

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

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

config.relative_url_root = "/app1"

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

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

3.21.1 Passengerを使う

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

3.21.2 リバースプロキシを使う

リバースプロキシを用いるアプリケーションをデプロイすることで、従来のデプロイと比べて確実なメリットが得られます。アプリケーションで必要なコンポーネントの層が追加され、サーバーを制御しやすくなります。

現代的なWebサーバーの多くは、キャッシュサーバーやアプリケーションサーバーなどのロードバランシングにプロキシサーバーを用いています。

Unicornは、リバースプロキシの背後で実行されるそうしたアプリケーションサーバーの1つです。

この場合、NGINXやApacheなどのプロキシサーバーを設定して、アプリケーションサーバー(ここではUnicorn)からの接続を受け付けるようにする必要があります。Unicornは、デフォルトでTCP接続のポート8000をリッスンしますが、このポート番号を変更したりソケットを用いるように設定することもできます。

詳しくはUnicorn readmeを参照し、背後の哲学を理解してください。

アプリケーションサーバーの設定が終わったら、Webサーバーも適切に設定してリクエストのプロキシを行わなければなりません。以下の設定はNGINXの設定に含まれることがあります。

upstream application_server {
  server 0.0.0.0:8080;
}

server {
  listen 80;
  server_name localhost;

  root /root/path/to/your_app/public;

  try_files $uri/index.html $uri.html @app;

  location @app {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://application_server;
  }

  # (省略)
}

最新情報については、必ずNGINXのドキュメントを参照してください。

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がすべて読み込まれた後に適用することができます。

自分のイニシャライザが、他のすべてのgemのイニシャライザが実行された後で実行されるという保証はありません。つまり、そうしたgemに依存する初期化コードはconfig.after_initilizeブロックに配置すべきです。

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

Railsではイニシャライザの複数のファイル名に番号を付けて読み込み順を制御するサポートがありますが、よりよい方法は同一ファイル内に記述するコードの順序で読み込み順を制御することです。この方がファイル名が散らからずに済みますし、依存関係も明確になり、アプリケーション内の新しい概念が見えやすくなります。

6 初期化イベント

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

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

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

  • to_prepare: これは、Railtiesの初期化処理とアプリケーション自身の初期化処理がすべて実行された後、かつ事前一括読み込み (eager loading) の実行とミドルウェアスタックの構築が行われる前に実行されます(訳注: RailtiesはRailsのコアライブラリの1つで、線路の犬釘を表すrail tieのもじりです)。さらに重要な点は、これは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
      # ここに初期化コードを書く
    end
  end
end

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

Rails.application.config.before_initialize do
  # ここに初期化コードを書く
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: このイニシャライザは、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です。

  • active_support.set_configs: Active Supportをセットアップします。config.active_support内の設定を用い、メソッド名をActiveSupportのセッターにsendし、値を渡します。

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

  • action_view.set_configs: Action Viewをセットアップします。config.action_view内の設定を用い、メソッド名をActionView::Baseのセッターにsendし、値を渡します。

  • action_controller.assets_config: 明示的に設定されていない場合は、config.actions_controller.assets_dirをアプリケーションのpublic/ディレクトリに設定されます。

  • action_controller.set_helpers_path: Action Controllerのhelpers_pathをアプリケーションのhelpers_pathに設定します。

  • action_controller.parameters_config: ActionController::Parametersで使うstrong parametersオプションを設定します。

  • action_controller.set_configs: Action Controllerをセットアップします。config.action_controller内の設定を用い、メソッド名をActionController::Baseのセッターにsendし、値を渡します。

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

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

  • active_record.logger: ActiveRecord::Base.loggerRails.loggerを設定します(設定が行われていない場合)。

  • active_record.migration_error: マイグレーションがペンディングされているかどうかをチェックするミドルウェアを設定します。

  • active_record.check_schema_cache_dump: 設定が見当たらない場合にスキーマキャッシュダンプを読み込みます。

  • active_record.warn_on_records_fetched_greater_than: クエリから戻ったレコード数が非常に多い場合の警告を有効にします。

  • active_record.set_configs: 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_reloader_hooks: config.cache_classesfalseの場合、再読み込み可能なデータベース接続をすべてリセットします。

  • active_record.add_watchable_files: 監視対象ファイルにschema.rbファイルとstructure.sqlファイルを追加します。

  • active_job.logger: ActiveJob::Base.loggerRails.loggerを設定します(設定が行われていない場合)。

  • active_job.set_configs: Active Jobをセットアップします。config.active_job内の設定を用い、メソッド名をActiveJob::Baseのセッターにsendし、値を渡します。

  • action_mailer.logger: ActionMailer::Base.loggerRails.loggerを設定します(設定が行われていない場合)。

  • action_mailer.set_configs: Active Jobをセットアップします。config.action_mailer内の設定を用い、メソッド名をActionMailer::Baseのセッターにsendし、値を渡します。

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

  • set_load_path: このイニシャライザはbootstrap_hookより前に実行されます。config.load_pathsおよびすべての自動読み込みパスが$LOAD_PATHに追加されます。

  • set_autoload_paths: このイニシャライザはbootstrap_hookより前に実行されます。app以下のすべてのサブディレクトリと、config.autoload_pathsconfig.eager_load_pathsconfig.autoload_once_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を読み込みます。

  • 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環境の1つのオブジェクトを引数に取ります。

  • 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_hook: ルーティングファイルをActiveSupport::Callbacks.to_runで再読み込みするようAction Dispatchを構成します。

  • disable_dependency_loading: config.eager_loadtrueの場合は自動依存関係読み込み(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やPumaやUnicornなどのアプリケーションサーバーの動作はどれも同じ振る舞いになります。最初はデータベース接続のプールは空で、必要に応じて追加接続が作成され、接続プールの上限に達するまで接続が追加されます。

1つのリクエストの中では、データベースアクセスが最初に必要になったときに接続をチェックアウト(貸出)し、リクエストの終わりではその接続をチェックイン(返却)します。つまり、キューで待機する次以降のリクエストで追加の接続スロットが再び利用できるようになります。

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

ActiveRecord::ConnectionTimeoutError - could not obtain a database connection within 5.000 seconds (waited 5.000 seconds)

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

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

8 カスタム設定

Railsの設定オブジェクトをカスタマイズして独自のコードを設定するには、config.x名前空間かconfigの直下にコードを配置します。両者の大きな違いは、ネストした設定(config.x.nested.nested.hiなど)の場合はconfig.xを利用すべきであるという点です。単一レベルの設定(config.helloなど)は単にconfigで行います。

  config.x.payment_processing.schedule = :daily
  config.x.payment_processing.retries  = 3
  config.super_debugger = true

これにより、設定オブジェクトを介してこれらの設定場所にアクセスできるようになります。

  Rails.configuration.x.payment_processing.schedule # => :daily
  Rails.configuration.x.payment_processing.retries  # => 3
  Rails.configuration.x.payment_processing.not_set  # => nil
  Rails.configuration.super_debugger                # => true

Rails::Application.config_forを使うと、設定ファイル全体を読み込むこともできます。

  # config/payment.yml:
  production:
    environment: production
    merchant_id: production_merchant_id
    public_key:  production_public_key
    private_key: production_private_key
  development:
    environment: sandbox
    merchant_id: development_merchant_id
    public_key:  development_public_key
    private_key: development_private_key

  # config/application.rb
  module MyApp
    class Application < Rails::Application
      config.payment = config_for(:payment)
    end
  end
  Rails.configuration.payment['merchant_id'] # => production_merchant_id or development_merchant_id

9 検索エンジンのインデックス作成

場合によっては、アプリケーションの一部のページをGoogleやBingやYahooやDuck Duck Goなどの検索サイトに知られないようにしたいことがあります。サイトのインデックスを作成するロボットは最初にhttp://your-site.com/robots.txtファイルの内容を分析して、インデックス作成を許可されているページを調べます。

Railsはこのファイルを/publicの下に作成します。デフォルトでは、検索エンジンにアプリケーションのすべてのページのインデックス作成を許可する設定になります。アプリケーションのすべてのページについてインデックス作成をブロックするには以下を使います。

User-agent: *
Disallow: /

特定のページのみをブロックする場合は、もう少し複雑な構文が必要です。robot.txtの公式ドキュメントを参照してください。

10 イベントベースのファイルシステム監視

Railsでlisten gemを使うと、イベントベースのファイルシステム監視を使ってファイルの変更を検出できます(config.cache_classesfalseの場合)。

group :development do
  gem 'listen', '>= 3.0.5', '< 3.2'
end

それ以外の場合、Railsはすべてのリクエストについてファイルの変更があるかをアプリケーションのツリーを調べます。

LinuxやmacOSでは追加のgemは不要ですが、*BSDWindowsでは追加のソフトウェアが必要になることがあります。

一部の設定がサポート対象外である点にご注意ください。

支援・協賛

Railsガイドは下記のサポーターから継続的な支援を受けています。