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固有の設定に使われます。

関連付けされたクラスを直接呼び出すのではなく、必ずpublicな設定メソッドを使うこと。例: ActionMailer::Base.optionsではなくRails.application.config.action_mailer.optionsを使う。

設定をクラスに直接適用する必要がある場合は、イニシャライザでActiveSupport::LazyLoadHooksをお使いください(初期化が完了する前にクラスがオートロードされるのを避けるため)。初期化中にオートロードされるとアプリの再読み込みを安全に繰り返せなくなるため、失敗します。

3.1 Rails全般の設定

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

3.1.1 config.after_initialize

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

config.after_initialize do
  ActionView::Base.sanitized_allowed_tags.delete 'div'
end
3.1.2 config.asset_host

アセットを置くホストを設定します。この設定は、アセットの置き場所がCDN(Contents Delivery Network)の場合や、別のドメインエイリアスを使うとブラウザの同時実行制限にひっかかるのを避けたい場合に便利です。この設定はconfig.action_controller.asset_hostのショートハンドです。

3.1.3 config.autoload_once_paths

サーバーへのリクエストごとにクリアされない定数を自動読み込みするパスの配列を渡せます。この設定はconfig.cache_classesfalse(developmentモードのデフォルト値)の場合に関連しています。それ以外の場合、自動読み込みは1度しか行われません。この配列内にあるすべての要素はautoload_pathsに存在しなければなりません。デフォルト値は空の配列です。

3.1.4 config.autoload_paths

Railsが定数を自動読み込みするパスの配列を渡せます。config.autoload_pathsのデフォルト値は、app以下のすべてのディレクトリです。Rails 6以降は、この設定の変更は推奨されません。詳しくは定数の自動読み込みと再読み込みを参照してください。

3.1.5 config.add_autoload_paths_to_load_path

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

3.1.6 config.cache_classes

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

3.1.7 config.beginning_of_week

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

3.1.8 config.cache_store

Railsでのキャッシュ処理に使われるキャッシュストアを設定します。指定できるオプションは次のシンボル:memory_store:file_store:mem_cache_store:null_store:redis_cache_storeのいずれか、またはキャッシュAPIを実装するオブジェクトです。デフォルト値は:file_storeです。ストアごとの設定オプションについてはキャッシュストアを参照してください。

3.1.9 config.colorize_logging

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

3.1.10 config.consider_all_requests_local

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

3.1.11 config.console

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

console do
  # このブロックはコンソールで実行されるときしか呼び出されない
  # 従ってpryを安全にrequireできる
  require "pry"
  config.console = Pry
end
3.1.12 config.disable_sandbox

コンソールをsandboxモードで起動してよいかどうかを制御します。これは、sandboxコンソールのセッションを長時間動かしっぱなしにするとデータベースサーバーのメモリが枯渇するのを避けるうえで有用です。デフォルト値はfalseです。

3.1.13 config.eager_load

trueにすると、登録されたconfig.eager_load_namespacesをeager loadingします。ここにはアプリケーション、エンジン、Railsフレームワークを含むあらゆる登録済み名前空間が含まれます。

3.1.14 config.eager_load_namespaces

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

3.1.15 config.eager_load_paths

パスの配列を引数に取ります。起動時のRailsは、cache_classesがオンの場合にこのパスからeager loadingします。デフォルトではアプリケーションのapp/ディレクトリ以下のすべてのディレクトリが対象です。

3.1.16 config.enable_dependency_loading

trueの場合、config.cache_classestrueに設定されていてもアプリケーション起動時の自動読み込みを有効にします。デフォルト値はfalseです。

3.1.17 config.encoding

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

3.1.18 config.exceptions_app

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

3.1.19 config.debug_exception_response_format

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

3.1.20 config.file_watcher

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

3.1.21 config.filter_parameters

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

3.1.22 config.force_ssl

すべてのリクエストをHTTPSプロトコル下で実行するよう強制し、URL生成でも"https://"をデフォルトのプロトコルに設定します。HTTPSの強制はActionDispatch::SSLミドルウェアによって行われ、config.ssl_optionsで設定できます。詳しくはAPIドキュメントActionDispatch::SSLを参照してください。

3.1.23 config.javascript_path

アプリのJavaScriptを保存するパスを、app/ディレクトリからの相対パスで設定します。デフォルト値はjavascriptです(webpackerで使われます)。アプリで設定済みのjavascript_pathautoload_pathsから除外されます。

3.1.24 config.log_formatter

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

3.1.25 config.log_level

Railsのログ出力をどのぐらい詳細にするかを指定します。デフォルト値は、production環境では:info、それ以外の環境では:debugです。指定可能な出力レベルは:debug:info:warn:error:fatal:unknownです。

3.1.26 config.log_tags

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

3.1.27 config.logger

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

  • フォーマッターをサポートする場合は、config.log_formatterの値を手動でロガーに代入しなければなりません。
  • タグ付きログをサポートする場合は、そのログのインスタンスをActiveSupport::TaggedLoggingでラップしなければなりません。
  • ログ出力の抑制をサポートするには、LoggerSilenceモジュールをincludeしなければなりません。ActiveSupport::Loggerクラスは既にこれらのモジュールにincludeされています。
class MyLogger < ::Logger
  include ActiveSupport::LoggerSilence
end

mylogger           = MyLogger.new(STDOUT)
mylogger.formatter = config.log_formatter
config.logger      = ActiveSupport::TaggedLogging.new(mylogger)
3.1.28 config.middleware

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

3.1.29 config.rake_eager_load

trueにすると、Rakeタスク実行中にアプリケーションをeager loadingします。デフォルト値はfalseです。

3.1.30 config.reload_classes_only_on_change

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

3.1.31 config.credentials.content_path

暗号化済みcredentialの探索パスを設定します。

3.1.32 config.credentials.key_path

暗号化キーの探索パスを設定します。

3.1.33 secret_key_base

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

3.1.34 config.require_master_key

ENV["RAILS_MASTER_KEY"]環境変数またはconfig/master.keyファイルでマスターキーを取得できない場合はアプリを起動しないようにします。

3.1.35 config.public_file_server.enabled

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

3.1.36 config.session_store

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

config.session_store :my_custom_store

カスタムストアはActionDispatch::Session::MyCustomStoreとして定義しなければなりません。

3.1.37 config.time_zone

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

3.2 アセットを設定する

3.2.1 config.assets.enabled

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

3.2.2 config.assets.css_compressor

CSSの圧縮に用いるプログラムを定義します。このオプションは、sass-railsによってデフォルトで設定されます。現時点で他に設定できるのは:yuiオプションだけです。この場合yui-compressor gemを利用します。

3.2.3 config.assets.js_compressor

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

3.2.4 config.assets.gzip

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

3.2.5 config.assets.paths

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

3.2.6 config.assets.precompile

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

3.2.7 config.assets.unknown_asset_fallback

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

3.2.8 config.assets.prefix

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

3.2.9 config.assets.manifest

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

3.2.10 config.assets.digest

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

3.2.11 config.assets.debug

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

3.2.12 config.assets.version

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

3.2.13 config.assets.compile

production環境での動的なSprocketsコンパイルをオンにするかどうかを指定するboolean値です。

3.2.14 config.assets.logger

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

3.2.15 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

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

  • 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と同じではありません。bin/rails generate scaffoldを実行したときに scaffoldでどのジェネレータでコントローラを生成するかを指定します。デフォルト値は:scaffold_controllerです。

  • test_framework: 利用するテストフレームワークを指定します。デフォルト値はfalseであり、この場合minitestが使われます。

  • template_engine: ビューのテンプレートエンジン(ERBやHamlなど)を指定します。デフォルト値は:erbです。

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

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

3.4.1 ActionDispatch::HostAuthorization

DNSリバインディングやその他のHostヘッダー攻撃を防ぎます。 development環境ではデフォルトで以下の設定が含まれます。

Rails.application.config.hosts = [
  IPAddr.new("0.0.0.0/0"),        # すべてのIPv4アドレス
  IPAddr.new("::/0"),             # すべてのIPv6アドレス
  "localhost",                    # localhost予約済みドメイン
  ENV["RAILS_DEVELOPMENT_HOSTS"]  # 開発用の追加ホストリスト(カンマ区切り)
]

development以外の環境では、Rails.application.config.hostsは空になり、Hostヘッダーチェックは行われません。production環境でヘッダー攻撃から保護したい場合は、以下のように手動でホストを許可する必要があります。

Rails.application.config.hosts << "product.com"

リクエストのホストは、case演算子(#===)でhostsのエントリと照合されるので、Regexp型、Proc型、IPAddr型のエントリがhostsでサポートされます。以下は正規表現を使った例です。

# `www.product.com`や`beta1.product.com`のようなサブドメインからの
# リクエストを許可する
Rails.application.config.hosts << /.*\.product\.com/

指定した正規表現はアンカー(\A\z)で囲まれるので、ホスト名全体とマッチしなければなりません。たとえば/product.com/はアンカーで囲まれるとwww.product.comとのマッチに失敗します。

特殊なケースとして、すべてのサブドメインの許可がサポートされます。

# `www.product.com`や`beta1.product.com`のようなサブドメインからの
# リクエストを許可する
Rails.application.config.hosts << ".product.com"

Host Authorizationチェックで特定のリクエストを除外するにはconfig.host_authorization.excludeを設定します。

# /healthcheck/パスへのリクエストをホストチェックから除外する
Rails.application.config.host_authorization = {
  exclude: ->(request) { request.path =~ /healthcheck/ }
}

許可されていないホストからのリクエストを受け取ると、デフォルトのRackアプリケーションが403 Forbiddenレスポンスを返します。この動作は以下のようにconfig.host_authorization.response_appを設定することでカスタマイズできます。

Rails.application.config.host_authorization = {
  response_app: -> env do
    [400, { "Content-Type" => "text/plain" }, ["Bad Request"]]
  end
}
3.4.2 ActionDispatch::SSL

すべてのリクエストでHTTPSプロトコルを強制します。これはconfig.force_ssltrueにすると有効になります。渡すオプションはconfig.ssl_optionsで設定できます。

3.4.3 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"に設定します。

3.4.4 ActionDispatch::Executor

スレッドセーフなコード再読み込みを許可します。これはconfig.allow_concurrencyfalseの場合に無効になり、Rack::Lockが読み込まれるようになります。Rack::Lockはアプリケーションをミューテックスにラップするので、同時に1つのスレッドでしか呼び出されなくなります。

3.4.5 ActiveSupport::Cache::Strategy::LocalCache

基本的なメモリバックアップ式キャッシュとして機能します。このキャッシュはスレッドセーフではなく、単一スレッド用の一時メモリキャッシュとして機能するためのものである点にご注意ください。

3.4.6 Rack::Runtime

X-Runtimeヘッダーを設定します。このヘッダーには、リクエストの実行に要した時間(秒)が含まれます。

3.4.7 Rails::Rack::Logger

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

3.4.8 ActionDispatch::ShowExceptions

アプリケーションから返されるすべての例外をrescueし、リクエストがローカルであるかconfig.consider_all_requests_localtrueに設定されている場合に適切な例外ページを出力します。config.action_dispatch.show_exceptionsfalseに設定されていると、常に例外が出力されます。

3.4.9 ActionDispatch::RequestId

レスポンスで利用できる独自のX-Request-Idヘッダーを作成し、ActionDispatch::Request#uuidメソッドを有効にします。config.action_dispatch.request_id_headerで設定可能です。

3.4.10 ActionDispatch::RemoteIp

IPスプーフィング攻撃が行われていないかどうかをチェックし、リクエストヘッダーから正しいclient_ipを取得します。この設定はconfig.action_dispatch.ip_spoofing_checkオプションとconfig.action_dispatch.trusted_proxiesオプションで変更可能です。

3.4.11 Rack::Sendfile

bodyがファイルから配信されているレスポンスをインターセプトし、サーバー固有のX-Sendfileヘッダーに差し替えてから送信します。この動作はconfig.action_dispatch.x_sendfile_headerで設定可能です。

3.4.12 ActionDispatch::Callbacks

リクエストを処理する前に、事前コールバックを実行します。

3.4.13 ActionDispatch::Cookies

リクエストにcookieを設定します。

3.4.14 ActionDispatch::Session::CookieStore

セッションをcookieに保存する役割を担います。config.action_controller.session_storeの値を変更すると別のミドルウェアを使えます。これに渡されるオプションはconfig.action_controller.session_optionsで設定できます。

3.4.15 ActionDispatch::Flash

flashキーを設定します。これは、config.action_controller.session_storeに値が設定されている場合にのみ有効です。

3.4.16 Rack::MethodOverride

params[:_method]が設定されている場合にHTTPメソッドの上書きを許可します。これは、HTTPでPATCH、PUT、DELETEメソッドを使えるようにするミドルウェアです。

3.4.17 Rack::Head

HEADリクエストをGETリクエストに変換して配信します。

3.4.18 カスタムミドルウェアを追加する

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

config.middleware.use Magical::Unicorns

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

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

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

config.middleware.insert_before 0, Magical::Unicorns

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

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

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

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

ミドルウェアをある位置から別の位置に移動できます。

config.middleware.move_before ActionDispatch::Flash, Magical::Unicorns

上はMagical::UnicornsミドルウェアをActionDispatch::Flashの直前に移動します。

以下のように直後に移動することもできます。

config.middleware.move_after ActionDispatch::Flash, Magical::Unicorns

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

config.middleware.delete Rack::MethodOverride

3.5 i18nを設定する

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

3.5.1 config.i18n.available_locales

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

3.5.2 config.i18n.default_locale

アプリケーションのi18nで使われるデフォルトのロケールを設定します。デフォルト値は:enです。

3.5.3 config.i18n.enforce_available_locales

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

3.5.4 config.i18n.load_path

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

3.5.5 config.i18n.raise_on_missing_translations

コントローラやビューで訳文が見つからない場合にエラーをraiseするかどうかを指定します。デフォルト値はfalseです。

3.5.6 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] }
  # または
  config.i18n.fallbacks.map = { az: :tr, da: [:de, :en] }

3.6 Active Modelを設定する

3.6.1 config.active_model.i18n_customize_full_message

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

3.7 Active Recordを設定する

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

3.7.1 config.active_record.logger

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

3.7.2 config.active_record.primary_key_prefix_type

主キーカラムの命名法を変更するのに使います。Railsでは、主キーカラムの名前にデフォルトでidが使われます (なおidにする場合は値の設定は不要です)。id以外に以下の2つを指定できます。

  • :table_name: たとえばCustomerクラスの主キーはcustomeridになります
  • :table_name_with_underscore: たとえばCustomerクラスの主キーはcustomer_idになります
3.7.3 config.active_record.table_name_prefix

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

3.7.4 config.active_record.table_name_suffix

テーブル名の末尾にグローバルに追加したい文字列を指定します。たとえば_northwestを指定すると、Customerクラスはcustomers_northwestをテーブルとして探します。デフォルト値は空文字列です。

3.7.5 config.active_record.schema_migrations_table_name

スキーママイグレーションのテーブル名に使う文字列を指定します。

3.7.6 config.active_record.internal_metadata_table_name

内部のメタテーブル名に使う文字列を設定できます。

3.7.7 config.active_record.protected_environments

破壊的操作を禁止すべき環境名を配列で設定できます。

3.7.8 config.active_record.pluralize_table_names

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

3.7.9 config.active_record.default_timezone

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

3.7.10 config.active_record.schema_format

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

3.7.11 config.active_record.error_on_ignored_order

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

3.7.12 config.active_record.timestamped_migrations

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

3.7.13 config.active_record.lock_optimistically

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

3.7.14 config.active_record.cache_timestamp_format

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

3.7.15 config.active_record.record_timestamps

モデルで発生するcreate操作やupdate操作にタイムスタンプを付けるかどうかを指定します。デフォルト値はtrueです。

3.7.16 config.active_record.partial_inserts

新規レコード作成で部分書き込みを行うかどうか(挿入時にデフォルトと異なる属性だけを設定するかどうか)を指定するboolean値です。

3.7.17 config.active_record.partial_updates

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

3.7.18 config.active_record.maintain_test_schema

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

3.7.19 config.active_record.dump_schema_after_migration

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

3.7.20 config.active_record.dump_schemas

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

3.7.21 config.active_record.belongs_to_required_by_default

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

3.7.22 config.active_record.action_on_strict_loading_violation

関連付けにstrict_loadingが設定されている場合に、例外をraiseするかログに出力するかを設定します。デフォルト値はすべての環境で:raiseです。これを:logに変更すると、例外をraiseせずにロガーに送信できます。

3.7.23 config.active_record.strict_loading_by_default

strict_loadingモードをデフォルトで有効にするか無効にするかを指定するboolean値です。デフォルト値はfalseです。

3.7.24 config.active_record.warn_on_records_fetched_greater_than

クエリ結果のサイズに応じて警告を出す場合の閾値(Threshold)を設定します。あるクエリから返されるレコード数がこの閾値を超えると、警告がログに出力されます。これは、メモリ肥大化の原因となっている可能性のあるクエリを特定するのに利用できます。

3.7.25 config.active_record.index_nested_attribute_errors

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

3.7.26 config.active_record.use_schema_cache_dump

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

3.7.27 config.active_record.cache_versioning

キャッシュバージョン変更を伴う安定した#cache_keyメソッドを#cache_versionメソッドで使うかどうかを指定します。

3.7.28 config.active_record.collection_cache_versioning

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

3.7.29 config.active_record.has_many_inversing

belongs_to関連付けをhas_many関連付けにトラバースするときにinverse_ofのレコードも設定されるようにします。

3.7.30 config.active_record.automatic_scope_inversing

スコープ付き関連付けでinverse_ofを自動的に推論するようにします。

3.7.31 config.active_record.legacy_connection_handling

新しいコネクションハンドリングAPIを有効化できます。この新しいAPIは、マルチプルデータベースを使うアプリケーション向けに粒度の細かいコネクションスワップをサポートします。

3.7.32 config.active_record.destroy_association_async_job

関連付けられたレコードの非同期削除に使うジョブを指定します。デフォルト値はActiveRecord::DestroyAssociationAsyncJobです。

3.7.33 config.active_record.queues.destroy

非同期の削除ジョブに使うActive Jobキューを指定できます。このオプションをnilにすると、purgeジョブがデフォルトのActive Jobキューに送信されます(config.active_job.default_queue_nameを参照)。デフォルト値はnilです。

3.7.34 config.active_record.enumerate_columns_in_select_statements

trueにすると、SELECT文に常にカラム名が含まれるようになり、SELECT * FROM ...のようなワイルドカードクエリを回避します。これにより、PostgreSQLデータベースにカラムを追加するときなどに、prepared statementのキャッシュエラーを回避できるようになります。デフォルト値はfalseです。

3.7.35 config.active_record.verify_foreign_keys_for_fixtures

フィクスチャがテストに読み込まれた後で、すべての外部キー制約が有効になるようにします(PostgreSQLとSQLiteのみ)。デフォルト値はfalseです。

3.7.36 config.active_record.query_log_tags_enabled

クエリコメントをアダプタレベルで有効にするかどうかを指定します。デフォルト値はfalseです。

3.7.37 config.active_record.query_log_tags

SQLコメントに挿入するキーバリュータグを指定するArrayを定義します。デフォルト値は、アプリケーション名を返す定義済みのタグ[ :application ]です。

3.7.38 config.active_record.cache_query_log_tags

クエリログタグのキャッシュを有効にするかどうかを指定します。クエリ数が非常に多いアプリケーションでは、クエリログタグのキャッシュを有効にすると、リクエストやジョブの実行中にコンテキストが変更されない場合にパフォーマンスが向上します。デフォルト値はfalseです。

3.7.39 config.active_record.schema_cache_ignored_tables

スキーマキャッシュの生成中に無視するテーブルのリストを定義します。テーブル名を表す文字列のArrayまたは正規表現を指定できます。

3.7.40 config.active_record.verbose_query_logs

データベースクエリを呼び出すメソッドのソースコードの位置を、関連するクエリでログに出力するかどうかを指定します。デフォルトでは、development環境でtrue、それ以外の環境ではfalseに設定されます。

3.7.41 config.active_record.async_query_executor

非同期クエリをプールする方法を指定します。

デフォルトはnilで、この場合load_asyncは無効になり、クエリをフォアグラウンドで直接実行します。 クエリを実際に非同期実行する場合は、必ず:global_thread_poolまたは:multi_thread_poolを指定しなければなりません。

:global_thread_pool: アプリケーションが接続するすべてのデータベースで単一のプールを使います。この設定は、データベースが1つしかないアプリケーションや、データベースのシャードに1度に1件しかクエリを発行しないアプリケーションに適しています。

:multi_thread_pool: データベースごとに1つのプールを使います。各プールのサイズは、database.ymlファイルのmax_threadsプロパティやmin_threadプロパティで設定できます。この設定は、クエリを複数のデータベースに対して発行することが多いアプリケーションで、並行処理の最大数をより正確に定義したい場面で有用です。

3.7.42 config.active_record.global_executor_concurrency

config.active_record.async_query_executor = :global_thread_pool設定で、並行に実行できる非同期クエリの個数を定義します。

デフォルトは4です。

この数値を検討するときは、database.ymlで設定されているデータベースプールのサイズと調和させなければなりません。コネクションプールのサイズは、フォアグラウンドのスレッド(Webサーバーやジョブワーカーのスレッド)とバックグラウンドのスレッドを両方とも扱えるサイズにする必要があります。

3.7.43 ActiveRecord::ConnectionAdapters::Mysql2Adapter.emulate_booleans

Active RecordのMySQLアダプタがすべてのtinyint(1)カラムをデフォルトでbooleanと認識するかどうかを指定します。デフォルト値はtrueです。

3.7.44 ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.create_unlogged_table

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

3.7.45 ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.datetime_type

マイグレーションやスキーマでdatetimeを呼び出したときに、Active RecordのPostgreSQLアダプタが使うネイティブ型を指定します。この設定が受け取るシンボルは、NATIVE_DATABASE_TYPESで設定された内容のいずれかに対応していなければなりません。デフォルト値は:timestampで、この場合マイグレーション内のt.datetimeで「タイムゾーンなしのタイムスタンプ」が作成されます。「タイムゾーン付きのタイムスタンプ」を使うには、イニシャライザで:timestamptzに変更します。この値を変更したときは、bin/rails db:migrateを実行してschema.rbをリビルドしてください。

3.7.46 ActiveRecord::SchemaDumper.ignore_tables

生成されるどのスキーマファイルにも含めたくないテーブル名の配列を渡せます。

3.7.47 ActiveRecord::SchemaDumper.fk_ignore_pattern

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

3.8 Action Controllerを設定する

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

3.8.1 config.action_controller.asset_host

アセットを置くホストを設定します。これは、アセットをホストする場所としてアプリケーションサーバーの代りにCDN(コンテンツ配信ネットワーク)を使いたい場合に便利です。この設定を使うのは、Action Mailerで別の設定を使う場合だけにとどめてください。それ以外の場合はconfig.asset_hostをお使いください。

3.8.2 config.action_controller.perform_caching

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

3.8.3 config.action_controller.default_static_extension

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

3.8.4 config.action_controller.include_all_helpers

すべてのビューヘルパーをあらゆる場所で使えるようにするか、対応するコントローラのスコープ内に限定するかを設定します。

falseに設定すると、たとえばUsersHelperUsersControllerの一部としてレンダリングされるビューでしか使えなくなります。trueに設定すると、このUsersHelperはどこからでも使えるようになります。

デフォルト設定の振る舞い(このオプションにtruefalseが明示的に設定されていない場合)は、どのコントローラでもあらゆるビューヘルパーを使えます。

3.8.5 config.action_controller.logger

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

3.8.6 config.action_controller.request_forgery_protection_token

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

3.8.7 config.action_controller.allow_forgery_protection

CSRF保護を有効にするかどうかを指定します。testモードではデフォルトでfalseに設定され、それ以外ではtrueに設定されます。

3.8.8 config.action_controller.forgery_protection_origin_check

CSRFの追加対策として、HTTPのOriginヘッダーがサイトのoriginと一致することをチェックすべきかどうかを設定します。

3.8.9 config.action_controller.per_form_csrf_tokens

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

3.8.10 config.action_controller.default_protect_from_forgery

フォージェリ保護をActionController:Baseに追加するかどうかを指定します。

3.8.11 config.action_controller.urlsafe_csrf_tokens

生成されるCSRFトークンをURL-safe(URLで使ってよい文字だけを使う)にするかどうかを設定します。

3.8.12 config.action_controller.relative_url_root

サブディレクトリへのデプロイを行っていることをRailsに指示するのに使えます。デフォルト値はENV['RAILS_RELATIVE_URL_ROOT']です。

3.8.13 config.action_controller.permit_all_parameters

マスアサインメント(mass assignment)されるすべてのパラメータをデフォルトで許可することを設定します。デフォルト値はfalseです。

3.8.14 config.action_controller.action_on_unpermitted_parameters

明示的に許可されていないパラメータが見つかった場合にログ出力または例外発生を行なうかどうかを指定します。test環境とdevelopment環境でのデフォルト値は:logであり、それ以外の環境ではfalseが設定されます。以下の値を指定できます。

  • false: 何もしない
  • :log: ActiveSupport::Notifications.instrumentイベントをunpermitted_parameters.action_controllerで発火し、DEBUGレベルでログ出力する
  • :raise: ActionController::UnpermittedParameters例外をraiseする
3.8.15 config.action_controller.always_permitted_parameters

デフォルトで許可される許可リストパラメータのリストを設定します。デフォルト値は ['controller', 'action']です。

3.8.16 config.action_controller.enable_fragment_cache_logging

フラグメントキャッシュの読み書きのログを以下のように詳細な形式で出力するかどうかを指定します。

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.8.17 config.action_controller.raise_on_open_redirects

許可されていないオープンリダイレクトが発生した場合にArgumentErrorをraiseします。デフォルト値はfalseです。

3.8.18 config.action_controller.log_query_tags_around_actions

クエリタグのコントローラコンテキストがaround_filterで更新されるかどうかを指定します。デフォルト値はtrueです。

3.8.19 config.action_controller.wrap_parameters_by_default

JSONリクエストをデフォルトでParamsWrapperでラップするように設定します。

3.8.20 ActionController::Base.wrap_parameters

ParamsWrapperを設定します。これはトップレベルで呼び出すことも、コントローラで個別に呼び出すこともできます。

3.9 Action Dispatchを設定する

3.9.1 config.action_dispatch.session_store

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

3.9.2 config.action_dispatch.default_headers

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

config.action_dispatch.default_headers = {
  'X-Frame-Options' => 'SAMEORIGIN',
  'X-XSS-Protection' => '0',
  'X-Content-Type-Options' => 'nosniff',
  'X-Download-Options' => 'noopen',
  'X-Permitted-Cross-Domain-Policies' => 'none',
  'Referrer-Policy' => 'strict-origin-when-cross-origin'
}
3.9.3 config.action_dispatch.default_charset

すべてのレンダリングで使うデフォルトの文字セットを指定します。デフォルト値はnilです。

3.9.4 config.action_dispatch.tld_length

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

3.9.5 config.action_dispatch.ignore_accept_header

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

3.9.6 config.action_dispatch.x_sendfile_header

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

3.9.7 config.action_dispatch.http_auth_salt

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

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

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

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

認証された暗号化済みcookieのsalt値を設定します。デフォルト値は'authenticated encrypted cookie'です。

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

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

3.9.14 config.action_dispatch.cookies_rotations

署名暗号化済みcookieの秘密情報、暗号化方式、ダイジェスト方式のローテーションを行えるようにします。

署名暗号化済みcookieが値の期限切れ情報に埋め込まれる場合に、暗号化済みcookieでAES-256-GCまたは旧AES-256-CBCで認証された暗号を用いるかどうかを指定します。デフォルト値はtrueです。

3.9.16 config.action_dispatch.use_cookies_with_metadata

purposeメタデータを埋め込んだcookieの書き込みを有効にします。デフォルト値はtrueです。

3.9.17 config.action_dispatch.perform_deep_munge

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

3.9.18 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に割り当てられます。

3.9.19 config.action_dispatch.return_only_request_media_type_on_content_type

ActionDispatch::Response#content_typeContent-Typeヘッダーを改変せずに返すよう変更します。

3.9.20 config.action_dispatch.cookies_same_site_protection

cookie設定時のSameSite属性のデフォルト値を設定します。nilに設定するとSameSite属性は追加されません。以下のようにprocを渡すことでリクエストに応じてSameSite属性の値を動的に設定できます。

config.action_dispatch.cookies_same_site_protection = ->(request) do
  :strict unless request.user_agent == "TestAgent"
end
3.9.21 config.action_dispatch.ssl_default_redirect_status

ActionDispatch::SSLミドルウェア内で、GETリクエストとHEADリクエスト以外のリクエストをHTTPからHTTPSにリダイレクトするときに用いるデフォルトのHTTPステータスコードを設定します。デフォルト値は、RFC7538で定義されている308です。

3.9.22 config.action_dispatch.log_rescued_responses

rescue_responsesで設定されている、処理されなかった例外のログ出力を有効にします。デフォルト値はtrueです。

3.9.23 ActionDispatch::Callbacks.before

リクエストより前に実行したいコードブロックを渡します。

3.9.24 ActionDispatch::Callbacks.after

リクエストの後に実行したいコードブロックを渡します。

3.10 Action Viewを設定する

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

3.10.1 config.action_view.cache_template_loading

リクエストのたびにビューテンプレートを再読み込みするかどうか(キャッシュしないかどうか)を指定します。デフォルト値はconfig.cache_classesに従います。

3.10.2 config.action_view.field_error_proc

Active Modelで発生したエラーの表示に使うHTMLジェネレータを指定します。渡したブロックは、Action Viewテンプレートのコンテキスト内で評価されます。デフォルト値は以下のとおりです。

Proc.new { |html_tag, instance| content_tag :div, html_tag, class: "field_with_errors" }
3.10.3 config.action_view.default_form_builder

Railsでデフォルトで使うフォームビルダーを指定します。デフォルト値は、ActionView::Helpers::FormBuilderです。フォームビルダーを初期化処理の後に読み込みたい場合(developmentモードではフォームビルダーがリクエストのたびに再読み込みされます)は、Stringとして渡すこともできます。

3.10.4 config.action_view.logger

Log4rのインターフェイスまたはデフォルトのRuby Loggerクラスに従うロガーを渡せます。このロガーは、Action Viewからの情報をログ出力するために使われます。ログ出力を無効にするにはnilを設定します。

3.10.5 config.action_view.erb_trim_mode

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

3.10.6 config.action_view.frozen_string_literal

ERBテンプレートを# frozen_string_literal: trueマジックコメント付きでコンパイルすることで、すべての文字列リテラルをfrozenにしてアロケーションを削減します。trueに設定するとすべてのビューで有効になります。

3.10.7 config.action_view.embed_authenticity_token_in_remote_forms

フォームでremote: trueを使う場合のauthenticity_tokenのデフォルトの動作を設定します。デフォルトではfalseで、この場合リモートフォームにはauthenticity_tokenフォームが含まれません。これはフォームでフラグメントキャッシュを使っている場合に便利です。

リモートフォームはmetaタグから認証を受け取るので、JavaScriptの動作しないブラウザをサポートしなければならない場合を除いて、トークンの埋め込みは不要です。JavaScriptが動かないブラウザのサポートが必要な場合は、authenticity_token: trueをフォームオプションとして渡すか、この設定をtrueにします。

3.10.8 config.action_view.prefix_partial_path_with_controller_namespace

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

<%= render @article %>

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

3.10.9 config.action_view.automatically_disable_submit_tag

クリック時にsubmit_tagを自動的に無効にするかどうかを指定します。デフォルト値はtrueです。

3.10.10 config.action_view.debug_missing_translation

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

3.10.11 config.action_view.form_with_generates_remote_forms

form_withでリモートフォームを生成するかどうかを指定します。

3.10.12 config.action_view.form_with_generates_ids

form_withでidを生成するかどうかを指定します。

3.10.13 config.action_view.default_enforce_utf8

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

3.10.14 config.action_view.image_loading

image_tagヘルパーでレンダリングされた<img>タグのloading属性のデフォルト値を指定します。

たとえば"lazy"を設定すると、image_tagヘルパーでレンダリングされた<img>タグにloading="lazy"が含まれ、画像がビューポートに近づくまで読み込みを遅延するようブラウザに指示しますimage_tagloading: "eager"渡すなどの方法で、画像ごとに挙動を上書きできます)。デフォルト値はnilです。

3.10.15 config.action_view.image_decoding

image_tagヘルパーでレンダリングされる<img>タグのdecoding属性に使うデフォルト値を指定します。デフォルト値はnilです。

3.10.16 config.action_view.annotate_rendered_view_with_filenames

レンダリングされたビューにテンプレートファイル名を追加するかどうかを指定します。デフォルト値はfalseです。

javascript_include_tagstylesheet_link_tagで、アセットをプリロードするLinkヘッダーを生成するかどうかを指定します。

3.10.18 config.action_view.button_to_generates_button_tag

button_toで、コンテンツが第1引数またはブロックとして渡されるかどうかにかかわらず、<button>要素をレンダリングするかどうかを指定します。

3.10.19 config.action_view.apply_stylesheet_media_default

media属性が提供されていない場合に、stylesheet_link_tagmedia属性のデフォルト値をscreenとしてレンダリングするかどうかを指定します。

3.11 Action Mailboxを設定する

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

3.11.1 config.action_mailbox.logger

Action Mailboxで用いるロガーを含みます。Log4rまたはデフォルトのRuby Loggerクラスに従うロガーを渡せます。デフォルト値はRails.loggerです。

config.action_mailbox.logger = ActiveSupport::Logger.new(STDOUT)
3.11.2 config.action_mailbox.incinerate_after

ActiveSupport::Durationを受け取ります。これはActionMailbox::InboundEmailレコードを処理後に自動的に破棄(destroy)するまでの期間を指定します。デフォルト値は30.daysです。

# 受信メールの処理後、14日後に「焼却」する
config.action_mailbox.incinerate_after = 14.days
3.11.3 config.action_mailbox.queues.incineration

焼却(incinerate)ジョブに用いるActive Jobキューを示すシンボルを渡せます。このオプションがnilの場合、焼却ジョブがデフォルトのActive Jobキューに送信されます(config.active_job.default_queue_nameを参照)。

3.11.4 config.action_mailbox.queues.routing

ルーティングジョブに用いるActive Jobキューを示すシンボルを渡せます。このオプションがnilの場合、ルーティングジョブがデフォルトのActive Jobキューに送信されます(config.active_job.default_queue_nameを参照)。

3.11.5 config.action_mailbox.storage_service

メールのアップロードに使うActive Storageサービスを示すシンボルで指定します。このオプションがnilの場合、メールがデフォルトのActive Storageサービスにアップロードされます(config.active_storage.serviceを参照)。

3.12 Action Mailerを設定する

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

3.12.1 config.action_mailer.asset_host

メイラーで用いるアセットのホストを指定します。アプリケーションサーバーではなくCDNにアセットをホスティングする場合に便利です。この設定はAction Controllerで異なるアセットホストを設定する場合にのみ使います。それ以外の場合はconfig.asset_hostをお使いください。

3.12.2 config.action_mailer.logger

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

3.12.3 config.action_mailer.smtp_settings

:smtp配信方法を詳細に設定するのに使えます。引数に渡すオプションハッシュには、以下のオプションを含められます。

  • :address: リモートのメールサーバーを指定します。デフォルトの"localhost"設定から変更します。
  • :port: 使うメールサーバーのポートが25番でない場合は(めったにないと思いますが)、ここで対応できます。
  • :domain: HELOドメインの指定が必要な場合に使います。
  • :user_name: メールサーバーで認証が要求される場合は、ここでユーザー名を設定します。
  • :password: メールサーバーで認証が要求される場合は、ここでパスワードを設定します。
  • :authentication: メールサーバーで認証が要求される場合は、ここで認証の種類を指定します。:plain:login:cram_md5のいずれかのシンボルを指定できます。
  • :enable_starttls: SMTPサーバーにSTARTTLSで接続します(サポートされていない場合は失敗します)。デフォルト値はfalseです。
  • :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)を有効にします。
  • :open_timeout: コネクション開始の試行中の待ち時間を秒で指定します。
  • :read_timeout: read(2)呼び出しのタイムアウトを秒で指定します。

また、Mail::SMTPをサポートする任意の設定オプションも渡せます。

3.12.4 config.action_mailer.smtp_timeout

メール配信用の:smtpメソッドの:open_timeout値と:read_timeout値を設定できます。

3.12.5 config.action_mailer.sendmail_settings

:sendmailの詳細な配信方法を設定できます。引数に渡すオプションハッシュには、以下のオプションを含められます。

  • :location - sendmail実行ファイルの場所。デフォルト値は/usr/sbin/sendmailです。
  • :arguments - コマンドラインに与える引数。デフォルト値は-iです。
3.12.6 config.action_mailer.raise_delivery_errors

メール配信が完了しなかった場合にエラーを発生させるかどうかを指定します。デフォルト値はtrueです。

3.12.7 config.action_mailer.delivery_method

メール配信方法を指定します。デフォルト値は:smtpです。詳しくはAction Mailerガイドを参照してください。

3.12.8 config.action_mailer.perform_deliveries

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

3.12.9 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"
}
3.12.10 config.action_mailer.observers

メールを配信したときに通知を受けるオブザーバーを登録します。

config.action_mailer.observers = ["MailObserver"]
3.12.11 config.action_mailer.interceptors

メールを送信する前に呼び出すインターセプタを登録します。

config.action_mailer.interceptors = ["MailInterceptor"]
3.12.12 config.action_mailer.preview_interceptors

メールのプレビュー前に呼び出すインターセプタを登録します。

config.action_mailer.preview_interceptors = ["MyPreviewMailInterceptor"]
3.12.13 config.action_mailer.preview_path

メイラーのプレビュー場所を指定します

config.action_mailer.preview_path = "#{Rails.root}/lib/mailer_previews"
3.12.14 config.action_mailer.show_previews

メイラーのプレビューを有効または無効にします。デフォルトではdevelopment環境でtrueです。

config.action_mailer.show_previews = false
3.12.15 config.action_mailer.deliver_later_queue_name

配信ジョブで用いるActive Jobキューを指定します。

このオプションがnilに設定されている場合、配信ジョブはデフォルトのActive Jobキューに送信されます(config.active_job.default_queue_nameを参照)。Active Jobアダプタが指定のキューを処理可能な設定になっていることも確認してください。そうしない場合、配信ジョブはエラーを出さずに無視される可能性があります。

3.12.16 config.action_mailer.perform_caching

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

3.12.17 config.action_mailer.delivery_job

メールの配信ジョブを指定します。

3.13 Active Supportを設定する

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

3.13.1 config.active_support.bare

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

3.13.2 config.active_support.test_order

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

3.13.3 config.active_support.escape_html_entities_in_json

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

3.13.4 config.active_support.use_standard_json_time_format

日付のシリアライズをISO 8601フォーマットで行うかどうかを指定します。デフォルト値はtrueです。

3.13.5 config.active_support.time_precision

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

3.13.6 config.active_support.hash_digest_class

重要でないダイジェスト(ETagヘッダーなど)の生成に用いるダイジェスト用クラスを設定します。

3.13.7 config.active_support.key_generator_hash_digest_class

暗号化済みcookieなどで、設定済みのsecretを元にsecretを導出するのに用いるダイジェスト用クラスを設定します。

3.13.8 config.active_support.use_authenticated_message_encryption

AES-256-CBCではなくAES-256-GCM認証済み暗号を用いるかどうかを指定します。

3.13.9 config.active_support.cache_format_version

利用するキャッシュシリアライザのバージョンを指定します。指定可能な値は6.17.0です。

3.13.10 config.active_support.deprecation

非推奨警告メッセージの振る舞いを設定します。:raise:stderr:log:notify:silenceを指定可能です。デフォルト値は:stderrです。ActiveSupport::Deprecation.behaviorでも設定可能です。

3.13.11 config.active_support.disallowed_deprecation

利用が許されない非推奨警告メッセージの振る舞いを設定します。:raise:stderr:log:notify:silenceを指定可能です。デフォルト値は:raiseです。ActiveSupport::Deprecation.disallowed_behaviorでも設定可能です。

3.13.12 config.active_support.disallowed_deprecation_warnings

アプリケーションで利用を許可しない項目として扱う非推奨警告メッセージを設定します。これを用いて、たとえば特定の非推奨項目を重大な失敗として扱えるようになります。ActiveSupport::Deprecation.disallowed_warningsでも設定可能です。

3.13.13 config.active_support.report_deprecations

利用が許されない非推奨項目も含めて、すべての非推奨警告メッセージを停止できます。ActiveSupport::Deprecation.warnの設定は無効になります。production環境ではデフォルトで有効になります。

3.13.14 config.active_support.isolation_level

Rails内部ステートのほとんどの局所性(locality)を設定します。Fiberベースのサーバーやジョブプロセッサ(falconなど)を使う場合は、:fiberを設定してください。 それ以外の場合は局所性を:threadにするのが最適です。

3.13.15 config.active_support.use_rfc4122_namespaced_uuids

生成される名前空間化UUIDで、Digest::UUID.uuid_v3メソッドやDigest::UUID.uuid_v5メソッドにStringとして渡す名前空間IDをRFC 4122標準に準拠させるかどうかを指定します。

trueに設定する場合:

  • 名前空間IDにはUUIDのみが許される。許されていない名前空間IDが渡されるとArgumentErrorが発生する。
  • 使われる名前空間がDigest::UUIDで定義された定数またはStringの場合に、非推奨警告メッセージを生成しない。
  • 名前空間IDは大文字小文字を区別しない。
  • 生成される名前空間化UUIDはすべて標準に準拠する。

falseに設定する場合:

  • 任意のString値を名前空間IDに利用可能(ただし推奨されない)。互換性維持のため、ArgumentErrorエラーは発生しない。
  • 渡される名前空間IDが、Digest::UUIDで定義される定数でない場合は非推奨警告メッセージを生成する。
  • 名前空間IDは大文字小文字が区別される。
  • Digest::UUIDで定義される名前空間ID定数を用いて生成される名前空間化UUIDのみが標準に準拠する。

新規アプリのデフォルト値はtrueです。アップグレードされるアプリでは、後方互換性用にfalseが設定されます。

3.13.16 config.active_support.executor_around_test_case

テストケースをラップするRails.application.executor.wrapを呼び出すように設定します。これにより、テストケースの振る舞いが実際のリクエストやジョブに近づきます。Active Recordクエリキャッシュや非同期クエリのような、通常のテストで無効にされる多くの機能が有効になります。

3.13.17 config.active_support.disable_to_s_conversion

ある種のRubyコアクラスに含まれる#to_sメソッドの上書きを無効にします。この設定は、アプリケーションでRuby 3.1の最適化をいち早く利用したい場合に使えます。

この設定は、config/application.rbApplicationクラス内に記述する必要があります。それ以外の場所では無効です。

3.13.18 ActiveSupport::Logger.silencer

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

3.13.19 ActiveSupport::Cache::Store.logger

キャッシュストア操作で使うロガーを指定します。

3.13.20 ActiveSupport.utc_to_local_returns_utc_offset_times

ActiveSupport::TimeZone.utc_to_localで、オフセットを考慮したUTC時間ではなく、UTCオフセットを考慮したローカル時間を返すように設定します。

3.14 Active Jobを設定する

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

3.14.1 config.active_job.queue_adapter

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

# 必ずGemfileにアダプタのgemを追加し、
# アダプタ固有のインストール/デプロイ方法に従うこと
config.active_job.queue_adapter = :sidekiq
3.14.2 config.active_job.default_queue_name

デフォルトのキュー名を変更できます。デフォルト値は"default"です。

config.active_job.default_queue_name = :medium_priority
3.14.3 config.active_job.queue_name_prefix

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

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

config.active_job.queue_name_prefix = Rails.env
class GuestsCleanupJob < ActiveJob::Base
  queue_as :high_priority
  #....
end
3.14.4 config.active_job.queue_name_delimiter

デフォルト値は'_'です。queue_name_prefixが設定されている場合は、プレフィックスされていないキュー名とプレフィックスの結合にqueue_name_delimiterが使われます。

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

# この区切り文字を使うにはprefixを設定しなければならない
config.active_job.queue_name_prefix = 'video_server'
config.active_job.queue_name_delimiter = '.'
class EncoderJob < ActiveJob::Base
  queue_as :low_priority
  #....
end
3.14.5 config.active_job.logger

Active Jobのログ情報に使うロガーとして、Log4rのインターフェイスに準拠したロガーか、デフォルトのRubyロガーを指定できます。このロガーは、Active JobのクラスかActive Jobのインスタンスでloggerを呼び出すことで取り出せます。ログ出力を無効にするにはnilを設定します。

3.14.6 config.active_job.custom_serializers

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

3.14.7 config.active_job.log_arguments

ジョブの引数をログに出力するかどうかを指定します。デフォルト値はtrueです。

3.14.8 config.active_job.retry_jitter

失敗したジョブをリトライするときに算出する遅延時間に加えるジッター(jitter: ランダムな微変動値)の総量を指定します。

3.14.9 config.active_job.log_query_tags_around_perform

クエリタグのジョブコンテキストがaround_performで自動的に更新されるようにするかどうかを指定します。デフォルト値はtrueです。

3.15 Action Cableを設定する

3.15.1 config.action_cable.url

Action CableサーバーがホストされているURLを文字列で指定します。Action Cableサーバーがメインのアプリケーションと別になっている場合に使う可能性があります。

3.15.2 config.action_cable.mount_path

Action Cableをメインサーバープロセスの一部としてマウントする場所を文字列で指定します。デフォルト値は/cableです。nilを設定すると、Action Cableは通常のRailsサーバーの一部としてマウントされなくなります。

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

3.16 Active Storageを設定する

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

3.16.1 config.active_storage.variant_processor

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

3.16.2 config.active_storage.analyzers

Active Storageのblob(binary large object)で利用できるアナライザを指定するクラスの配列を受け取ります。デフォルトでは以下のように定義されます。

config.active_storage.analyzers = [ActiveStorage::Analyzer::ImageAnalyzer::Vips, ActiveStorage::Analyzer::ImageAnalyzer::ImageMagick, ActiveStorage::Analyzer::VideoAnalyzer, ActiveStorage::Analyzer::AudioAnalyzer]

画像アナライザは、画像blobの幅(width)や高さ(height)を取り出せます。

動画アナライザは、動画blobの幅(width)、高さ(height)、再生時間(duration)、角度(angle)、アスペクト比(aspect ratio)、動画/音声チャンネルの有無を取り出せます。

音声アナライザは、音声blobの再生時間やビットレートを取り出せます。

3.16.3 config.active_storage.previewers

Active Storageのblobで利用できる画像プレビューアを指定するクラスを配列で受け取ります。デフォルトでは以下のように定義されます。

config.active_storage.previewers = [ActiveStorage::Previewer::PopplerPDFPreviewer, ActiveStorage::Previewer::MuPDFPreviewer, ActiveStorage::Previewer::VideoPreviewer]

PopplerPDFPreviewerMuPDFPreviewerはPDF blobの最初のページのサムネイルを生成できます。

VideoPreviewerは動画blobのフレームの中から動画の内容を代表するフレームを生成できます。

3.16.4 config.active_storage.paths

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

  • :ffprobe: ffprobe実行ファイルの場所
  • :mutool: mutool実行ファイルの場所
  • :ffmpeg: ffmpeg実行ファイルの場所
config.active_storage.paths[:ffprobe] = '/usr/local/bin/ffprobe'
3.16.5 config.active_storage.variable_content_types

Active StorageがImageMagickに変換可能なcontent typeを示す文字列を配列で受け取ります。デフォルトでは以下のように定義されます。

config.active_storage.variable_content_types = %w(image/png image/gif image/jpeg image/tiff image/vnd.adobe.photoshop image/vnd.microsoft.icon image/webp image/avif image/heic image/heif)
3.16.6 config.active_storage.web_image_content_types

variantをフォールバック用のPNGフォーマットに変換せずに処理可能なWeb画像Content-Typeを示す文字列を配列で受け取ります。アプリケーションのvariant処理にWebPAVIFを使いたい場合は、この配列にimage/webpimage/avifを追加できます。デフォルトでは以下のように定義されます。

config.active_storage.web_image_content_types = %w(image/png image/jpeg image/gif)
3.16.7 config.active_storage.content_types_to_serve_as_binary

Active Storageが常に添付ファイルとして扱うContent-Typeを示す文字列を配列で受け取ります。デフォルトでは以下のように定義されます。

config.active_storage.content_types_to_serve_as_binary = %w(text/html image/svg+xml application/postscript application/x-shockwave-flash text/xml application/xml application/xhtml+xml application/mathml+xml text/cache-manifest)
3.16.8 config.active_storage.content_types_allowed_inline

Active Storageでインライン配信を許可するContent-Typeを示す文字列を配列で受け取ります。デフォルトでは以下のように定義されます。

config.active_storage.content_types_allowed_inline` = %w(image/png image/gif image/jpeg image/tiff image/vnd.adobe.photoshop image/vnd.microsoft.icon application/pdf)

3.16.9 config.active_storage.silence_invalid_content_types_warning

Rails 7以降は、Rails 6で誤ってサポートされていた無効なContent-Typeを使うとActive Storageで警告メッセージが表示されます。この警告メッセージは以下の設定でオフにできます。

config.active_storage.silence_invalid_content_types_warning = false
3.16.10 config.active_storage.queues.analysis

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

config.active_storage.queues.analysis = :low_priority
3.16.11 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
3.16.12 config.active_storage.queues.mirror

ダイレクトアップロードのミラーリングジョブに用いるActive Jobキューをシンボルで指定します。このオプションがnilの場合、ミラーリングジョブはデフォルトのActive Jobキューに送信されます(config.active_job.default_queue_nameを参照)。デフォルト値はnilです。

config.active_storage.queues.mirror = :low_priority
3.16.13 config.active_storage.logger

Active Storageで用いられるロガーを設定できます。Log4rのインターフェイスに沿ったロガーや、デフォルトのRuby Loggerクラスを指定できます。

config.active_storage.logger = ActiveSupport::Logger.new(STDOUT)
3.16.14 config.active_storage.service_urls_expire_in

以下によって生成されるURLのデフォルトの有効期限を指定します。

  • ActiveStorage::Blob#url
  • ActiveStorage::Blob#service_url_for_direct_upload
  • ActiveStorage::Variant#url

デフォルト値は5分間です。

3.16.15 config.active_storage.urls_expire_in

Active Storageで生成される、Railsアプリケーション内URLのデフォルトの有効期限を指定します。デフォルト値はnilです。

3.16.16 config.active_storage.routes_prefix

Active Storageが提供するルーティングのプレフィックスを設定できます。生成されるルーティングの冒頭に追加する文字列を渡せます。

config.active_storage.routes_prefix = '/files'

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

3.16.17 config.active_storage.replace_on_assign_to_many

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

3.16.18 config.active_storage.track_variants

variantをデータベースに記録するかどうかを指定します。デフォルト値はtrueです。

3.16.19 config.active_storage.draw_routes

Active Storageのルーティング生成をオンオフできます。デフォルト値はtrueです。

3.16.20 config.active_storage.resolve_model_to_route

Active Storageのファイル配信方法をグローバルに変更できます。

利用可能な値は以下です。

  • :rails_storage_redirect: 署名済みの短命なサービスURLにリダイレクトする
  • :rails_storage_proxy: プロキシファイルでダウンロードする

デフォルト値は:rails_storage_redirectです。

3.16.21 config.active_storage.video_preview_arguments

ffmpegの動画プレビュー画像生成方法を変更できます。

config.load_defaults 7.0の場合はデフォルトで以下が定義されます。

config.active_storage.video_preview_arguments = "-vf 'select=eq(n\\,0)+eq(key\\,1)+gt(scene\\,0.015),loop=loop=-1:size=2,trim=start_frame=1' -frames:v 1 -f image2"

振る舞いは以下のようになります。

  1. select=eq(n\,0)+eq(key\,1)+gt(scene\,0.015): 冒頭の動画フレームとキーフレーム、閾値に合う場面変更のフレーム
  2. loop=loop=-1:size=2,trim=start_frame=1: 他のフレームが条件を満たさない場合は冒頭の動画フレームにフォールバックする(選択したフレームの冒頭の1つまたは2つをループさせてから、冒頭のループフレームを削除する)
3.16.22 config.active_storage.multiple_file_field_include_hidden

Rails 7.1以降、Active Storageのhas_many_attachedリレーションシップは、デフォルトで現在のコレクションに追加されるのではなく、デフォルトで現在のコレクションを置き換えるようになる予定です。「空の」コレクションの送信をサポートするには、Action Viewのフォームビルダーでチェックボックス要素をレンダリングするのと同じ要領で、補助的な隠しフィールドをレンダリングしてください。

3.17 Action Textを設定する

3.17.1 config.action_text.attachment_tag_name

添付ファイルをラップするHTMLタグを文字列で指定します。デフォルト値は"action-text-attachment"です。

3.18 load_defaultsの結果

config.load_defaultsは、渡されたバージョンまでのデフォルト値を含む新しいデフォルト値を設定します。たとえば6.0を指定すると、6.0以前のあらゆるバージョンのデフォルト値も取得できます。

3.18.1 '7.0'を指定した場合(以前のバージョンのデフォルト値を除く)
  • config.action_controller.raise_on_open_redirects: true
  • config.action_view.button_to_generates_button_tag: true
  • config.action_view.apply_stylesheet_media_default: false
  • config.active_support.key_generator_hash_digest_class: OpenSSL::Digest::SHA256
  • config.active_support.hash_digest_class: OpenSSL::Digest::SHA256
  • config.active_support.cache_format_version: 7.0
  • config.active_support.remove_deprecated_time_with_zone_name: true
  • config.active_support.executor_around_test_case: true
  • config.active_support.use_rfc4122_namespaced_uuids: true
  • config.active_support.disable_to_s_conversion: true
  • config.action_dispatch.return_only_request_media_type_on_content_type: false
  • config.action_dispatch.cookies_serializer: :json
  • config.action_mailer.smtp_timeout: 5
  • config.active_storage.video_preview_arguments: "-vf 'select=eq(n\\,0)+eq(key\\,1)+gt(scene\\,0.015),loop=loop=-1:size=2,trim=start_frame=1' -frames:v 1 -f image2"
  • config.active_storage.multiple_file_field_include_hidden: true
  • config.active_record.automatic_scope_inversing: true
  • config.active_record.verify_foreign_keys_for_fixtures: true
  • config.active_record.partial_inserts: false
  • config.active_storage.variant_processor: :vips
  • config.action_controller.wrap_parameters_by_default: true
  • config.action_dispatch.default_headers:
    {
      "X-Frame-Options" => "SAMEORIGIN",
      "X-XSS-Protection" => "0",
      "X-Content-Type-Options" => "nosniff",
      "X-Download-Options" => "noopen",
      "X-Permitted-Cross-Domain-Policies" => "none",
      "Referrer-Policy" => "strict-origin-when-cross-origin"
    }
3.18.2 '6.1'を指定した場合(以前のバージョンのデフォルト値を除く)
  • config.active_record.has_many_inversing: true
  • config.active_record.legacy_connection_handling: false
  • config.active_storage.track_variants: true
  • config.active_storage.queues.analysis: nil
  • config.active_storage.queues.purge: nil
  • config.action_mailbox.queues.incineration: nil
  • config.action_mailbox.queues.routing: nil
  • config.action_mailer.deliver_later_queue_name: nil
  • config.active_job.retry_jitter: 0.15
  • config.action_dispatch.cookies_same_site_protection: :lax
  • config.action_dispatch.ssl_default_redirect_status = 308
  • ActiveSupport.utc_to_local_returns_utc_offset_times: true
  • config.action_controller.urlsafe_csrf_tokens: true
  • config.action_view.form_with_generates_remote_forms: false
  • config.action_view.preload_links_header: true
3.18.3 '6.0'を指定した場合(以前のバージョンのデフォルト値を除く)
  • config.autoloader: :zeitwerk
  • config.action_view.default_enforce_utf8: false
  • config.action_dispatch.use_cookies_with_metadata: true
  • config.action_mailer.delivery_job: "ActionMailer::MailDeliveryJob"
  • 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.4 '5.2'を指定した場合(以前のバージョンのデフォルト値を除く)
  • config.active_record.cache_versioning: true
  • config.action_dispatch.use_authenticated_cookie_encryption: true
  • config.active_support.use_authenticated_message_encryption: true
  • config.active_support.hash_digest_class: OpenSSL::Digest::SHA1
  • config.action_controller.default_protect_from_forgery: true
  • config.action_view.form_with_generates_ids: true
3.18.5 '5.1'を指定した場合(以前のバージョンのデフォルト値を除く)
  • config.assets.unknown_asset_fallback: false
  • config.action_view.form_with_generates_remote_forms: true
3.18.6 '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.18.7 基本のデフォルト値
  • config.action_controller.default_protect_from_forgery: false
  • config.action_controller.raise_on_open_redirects: false
  • config.action_controller.urlsafe_csrf_tokens: false
  • config.action_dispatch.cookies_same_site_protection: nil
  • config.action_mailer.delivery_job: ActionMailer::MailDeliveryJob
  • config.action_view.form_with_generates_ids: false
  • config.action_view.preload_links_header: nil
  • config.action_view.button_to_generates_button_tag: false
  • config.action_view.apply_stylesheet_media_default: true
  • config.active_job.retry_jitter: 0.0
  • config.action_mailbox.queues.incineration: :action_mailbox_incineration
  • config.action_mailbox.queues.routing: :action_mailbox_routing
  • config.action_mailer.deliver_later_queue_name: :mailers
  • config.active_record.collection_cache_versioning: false
  • config.active_record.cache_versioning: false
  • config.active_record.has_many_inversing: false
  • config.active_record.legacy_connection_handling: true
  • config.active_record.partial_inserts: true
  • config.active_support.use_authenticated_message_encryption: false
  • config.active_support.hash_digest_class: OpenSSL::Digest::MD5
  • config.active_support.key_generator_hash_digest_class: OpenSSL::Digest::SHA1
  • config.active_support.cache_format_version: 6.1
  • config.active_support.executor_around_test_case: false
  • config.active_support.isolation_level: :thread
  • config.active_support.use_rfc4122_namespaced_uuids: false
  • config.active_support.disable_to_s_conversion: false
  • config.action_dispatch.return_only_request_media_type_on_content_type: true
  • ActiveSupport.utc_to_local_returns_utc_offset_times: false
  • config.action_mailer.smtp_timeout: nil
  • config.active_storage.video_preview_arguments: "-y -vframes 1 -f image2"
  • config.active_storage.multiple_file_field_include_hidden: false
  • config.active_storage.variant_processor: :mini_magick
  • config.action_controller.wrap_parameters_by_default: false
  • 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"
    }

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

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

データベース接続の設定方法は、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

$ bin/rails runner 'puts ActiveRecord::Base.configurations'
#<ActiveRecord::DatabaseConfigurations:0x00007fd50e209a28>

$ bin/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

$ bin/rails runner 'puts ActiveRecord::Base.configurations'
#<ActiveRecord::DatabaseConfigurations:0x00007fd50e209a28>

$ bin/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

$ bin/rails runner 'puts ActiveRecord::Base.configurations'
#<ActiveRecord::DatabaseConfigurations:0x00007fd50e209a28>

$ bin/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.20.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.20.2 MySQLやMariaDBデータベースを設定する

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

development:
  adapter: mysql2
  encoding: utf8mb4
  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.20.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.20.4 JRubyプラットフォームでSQLite3データベースを設定する

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

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

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

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

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

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

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

3.20.7 メタデータストレージを設定する

Railsは、自分のRails環境とスキーマに関する情報を、ar_internal_metadataという名前の内部テーブルにデフォルトで保存します。

この機能をコネクションごとにオフにするには、利用するデータベース設定ファイルで以下のようにuse_metadata_tableを設定します。これは、共有データベースで作業する場合や、テーブル作成権限を持たないデータベースユーザーで作業する場合に便利です。

development:
  adapter: postgresql
  use_metadata_table: false

3.21 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.22 サブディレクトリにデプロイする(相対URL rootの利用)

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

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

config.relative_url_root = "/app1"

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

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

3.22.1 Passengerを使う

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

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

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

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

Unicornは、リバースプロキシの背後で実行されるアプリケーションサーバーの例です。

この場合、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のキャッシュを扱うコードで拡張キャッシュを生成するために使われます。これにより、1つのアプリケーションの中で複数の独立したキャッシュを扱えるようになります。

5 イニシャライザファイルを使う

Railsは、フレームワークの読み込みとすべてのgemの読み込みが完了してから、イニシャライザの読み込みを開始します。イニシャライザとは、アプリケーションのconfig/initializersディレクトリに保存されているRubyファイルのことです。

イニシャライザファイルには、フレームワークやgemがすべて読み込まれた後に行いたい設定(フレームワークやgemを設定するオプションなど)を保存できます。

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

6 初期化イベント

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

6.1 before_configuration

このフックは、アプリケーションがRails::Applicationから定数を継承した直後に実行されます。config呼び出しは、このイベントより前に評価されます。

6.1.1 before_initialize

このフックは、:bootstrap_hookイニシャライザによる初期化プロセスの直前に直接実行されます。:bootstrap_hookは、Railsアプリケーション初期化プロセスのうち比較的初期の段階で実行されます。

6.1.2 to_prepare

このフックは、Railtiesの初期化処理とアプリケーション自身の初期化処理がすべて完了した後で、かつeager loadingとミドルウェアスタックの構築が行われる前に実行されます。さらに重要な点は、このフックはdevelopmentモードではサーバーへのリクエストのたびに必ず実行されますが、productionモードとtestモードでは起動時に1度しか実行されないことです。

6.1.3 before_eager_load

このフックは、事前eager loadingの前に直接実行されます。これはproduction環境のデフォルトの動作で、development環境では実行されません。

6.1.4 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.2 Rails::Railtie#initializer

Railsには起動時に実行されるさまざまなイニシャライザがあり、それらはすべてRails::Railtieinitializerメソッドで定義されます。以下は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を使った場合は除きます)。

イニシャライザの起動順序は、論理的に矛盾が生じない限り、どのイニシャライザの前または後にでも配置可能です。たとえば、"one"〜"four"という4つのイニシャライザがあり、かつこの順序で定義されたとします。ここで"four"を"two"よりかつ"three"よりもになるように定義すると論理矛盾が発生し、イニシャライザの実行順を決定できなくなってしまいます。

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

Rails::ApplicationRails::Railtieを間接的に継承しているので、config/application.rbinitializerメソッドを使ってアプリケーションの初期化処理を定義できます。

6.3 イニシャライザ

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

6.3.1 load_environment_hook

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

6.3.2 load_active_support

Active Supportの基本部分を設定するactive_support/dependenciesrequireします。config.active_support.bareがない場合はデフォルトでactive_support/allrequireします。

6.3.3 initialize_logger

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

6.3.4 initialize_cache

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

6.3.5 set_clear_dependencies_hook

このイニシャライザは、cache_classesfalseの場合にのみ実行され、オブジェクト空間からのリクエスト中に参照された定数をActionDispatch::Callbacks.afterで削除します。これにより、これらの定数が以後のリクエストで再読み込みされるようになります。

6.3.6 bootstrap_hook

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

6.3.7 i18n.callbacks

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

6.3.8 active_support.deprecation_behavior

環境に応じた非推奨項目レポートをセットアップします。デフォルト値は、development環境では:log、production環境では:silence、test環境では:stderrです。値は配列で設定できます。

このイニシャライザは、許可しない非推奨項目の扱いについても設定します。デフォルト値は、development環境では:raise、production環境では:silenceです。許可しない非推奨警告のデフォルト値は、空の配列です。

6.3.9 active_support.initialize_time_zone

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

6.3.10 active_support.initialize_beginning_of_week

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

6.3.11 active_support.set_configs

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

6.3.12 action_dispatch.configure

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

6.3.13 action_view.set_configs

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

6.3.14 action_controller.assets_config

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

6.3.15 action_controller.set_helpers_path

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

6.3.16 action_controller.parameters_config

ActionController::Parametersで使うStrong Parametersオプションを設定します。

6.3.17 action_controller.set_configs

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

6.3.18 action_controller.compile_config_methods

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

6.3.19 active_record.initialize_timezone

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

6.3.20 active_record.logger

ActiveRecord::Base.loggerRails.loggerを設定します(未設定の場合)。

6.3.21 active_record.migration_error

未実行のマイグレーションがあるかどうかをチェックするミドルウェアを設定します。

6.3.22 active_record.check_schema_cache_dump

スキーマキャッシュダンプを読み込みます(設定済みかつ可能な場合)。

6.3.23 active_record.warn_on_records_fetched_greater_than

クエリから返されたレコード数が非常に多い場合の警告を有効にします。

6.3.24 active_record.set_configs

config.active_record内の設定を用いてActive Recordをセットアップします。メソッド名をActiveRecord::Baseのセッターとしてsendし、その値をActive Recordに渡します。

6.3.25 active_record.initialize_database

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

6.3.26 active_record.log_runtime

リクエストでActive Record呼び出しに要した時間をロガーに出力するActiveRecord::Railties::ControllerRuntimeをインクルードします。

6.3.27 active_record.set_reloader_hooks

config.cache_classesfalseの場合、再読み込み可能なデータベース接続をすべてリセットします。

6.3.28 active_record.add_watchable_files

変更の監視対象ファイルにschema.rbファイルとstructure.sqlファイルを追加します。

6.3.29 active_job.logger

ActiveJob::Base.loggerRails.loggerを設定します(未設定の場合)。

6.3.30 active_job.set_configs

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

6.3.31 action_mailer.logger

ActionMailer::Base.loggerRails.loggerを設定します(未設定の場合)。

6.3.32 action_mailer.set_configs

config.action_mailer内の設定を用いてAction Mailerをセットアップします。メソッド名をActionMailer::Baseのセッターとしてsendし、その値をAction Mailerに渡します。

6.3.33 action_mailer.compile_config_methods

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

6.3.34 set_load_path

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

6.3.35 set_autoload_paths

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

6.3.36 add_routing_paths

デフォルトで、アプリケーションやrailtiesやエンジンにあるconfig/routes.rbファイルをすべて読み込み、アプリケーションのルーティングを設定します。

6.3.37 add_locales

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

6.3.38 add_view_paths

app/views(アプリケーションとrailties、エンジンも含む)へのパスをビューファイルへの探索パスに追加します。

6.3.39 load_environment_config

現在の環境に対応するconfig/environmentsを読み込みます。

6.3.40 prepend_helpers_path

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

6.3.41 load_config_initializers

アプリケーションやrailtiesやエンジンにあるconfig/initializersのRubyファイルをすべて読み込みます。このディレクトリに置かれているファイルには、フレームワークの読み込みがすべて完了した後に行うべき設定も保存できます。

6.3.42 engines_blank_point

エンジンの読み込みが完了する前に行いたい処理に使う初期化ポイントへのフックを提供します。このポイント以後は、railtiesやエンジンのイニシャライザはすべて実行されます。

6.3.43 add_generator_templates

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

6.3.44 ensure_autoload_once_paths_as_subset

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

6.3.45 add_to_prepare_blocks

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

6.3.46 add_builtin_route

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

6.3.47 build_middleware_stack

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

6.3.48 eager_load!

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

6.3.49 finisher_hook

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

6.3.50 set_routes_reloader_hook

ルーティングファイルがActiveSupport::Callbacks.to_runで再読み込みされるようAction Dispatchを構成します。

6.3.51 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

Rails::Application.config_forは、共通の設定をグループ化するshared設定をサポートしています。この共有設定は、環境設定にマージされます。

# config/example.yml
shared:
  foo:
    bar:
      baz: 1

development:
  foo:
    bar:
      qux: 2
# development environment
Rails.application.config_for(:example)[:foo][:bar] #=> { baz: 1, qux: 2 }

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

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

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

User-agent: *
Disallow: /

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

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

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

group :development do
  gem 'listen', '~> 3.3'
end

listen gemを使わない場合、Railsはリクエストのたびにファイルの変更の有無を検出するためにアプリケーションのツリーをすべて探索します。

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

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

フィードバックについて

Railsガイドは GitHub の yasslab/railsguides.jp で管理・公開されております。本ガイドを読んで気になる文章や間違ったコードを見かけたら、気軽に Pull Request を出して頂けると嬉しいです。Pull Request の送り方については GitHub の README をご参照ください。

原著における間違いを見つけたら『Rails のドキュメントに貢献する』を参考にしながらぜひ Rails コミュニティに貢献してみてください 🛠💨✨

本ガイドの品質向上に向けて、皆さまのご協力が得られれば嬉しいです。よろしくお願いします。

YassLab 株式会社
https://yasslab.jp/

支援・協賛

Railsガイドは下記のサポーターから継続的な支援を受けています。Railsガイドへの支援・協賛にご興味あれば info@yasslab.jp までお問い合わせください。

  1. Star
  2. このエントリーをはてなブックマークに追加