更多内容请访问 rubyonrails.org:

1. 初始化代码的位置

Rails 提供了四个标准的初始化代码放置位置

  • config/application.rb
  • 环境特定的配置文件
  • 初始化器
  • 后初始化器

2. 在 Rails 之前运行代码

在极少数情况下,如果您的应用程序需要在 Rails 本身加载之前运行一些代码,请将其放在 config/application.rbrequire "rails/all" 调用上方。

3. 配置 Rails 组件

通常,配置 Rails 的工作意味着配置 Rails 的组件以及配置 Rails 本身。配置文件 config/application.rb 和环境特定的配置文件(例如 config/environments/production.rb)允许您指定要传递给所有组件的各种设置。

例如,您可以将此设置添加到 config/application.rb 文件中

config.time_zone = "Central Time (US & Canada)"

这是 Rails 本身的设置。如果您想将设置传递给单独的 Rails 组件,可以通过 config/application.rb 中的相同 config 对象进行操作

config.active_record.schema_format = :ruby

Rails 将使用该特定设置来配置 Active Record。

使用公共配置方法,而不是直接调用关联的类。例如,Rails.application.config.action_mailer.options 而不是 ActionMailer::Base.options

如果您需要直接对类应用配置,请在初始化器中使用延迟加载钩子,以避免在初始化完成之前自动加载该类。这会导致错误,因为在初始化期间自动加载在应用程序重新加载时无法安全地重复。

3.1. 版本化默认值

config.load_defaults 加载目标版本和所有早期版本的默认配置值。例如,config.load_defaults 6.1 将加载包括版本 6.1 在内的所有版本的默认值。

以下是每个目标版本关联的默认值。在值冲突的情况下,新版本优先于旧版本。

3.1.1. 目标版本 8.1 的默认值

3.1.2. 目标版本 8.0 的默认值

3.1.3. 目标版本 7.2 的默认值

3.1.4. 目标版本 7.1 的默认值

3.1.5. 目标版本 7.0 的默认值

3.1.6. 目标版本 6.1 的默认值

3.1.7. 目标版本 6.0 的默认值

3.1.8. 目标版本 5.2 的默认值

3.1.9. 目标版本 5.1 的默认值

3.1.10. 目标版本 5.0 的默认值

3.2. Rails 通用配置

以下配置方法将在 Rails::Railtie 对象上调用,例如 Rails::EngineRails::Application 的子类。

3.2.1. config.add_autoload_paths_to_load_path

表示是否需要将自动加载路径添加到 $LOAD_PATH。建议在 config/application.rb 中的 :zeitwerk 模式下尽早将其设置为 false。Zeitwerk 在内部使用绝对路径,并且在 :zeitwerk 模式下运行的应用程序不需要 require_dependency,因此模型、控制器、作业等不需要在 $LOAD_PATH 中。将其设置为 false 可以使 Ruby 在使用相对路径解析 require 调用时避免检查这些目录,并节省 Bootsnap 的工作和 RAM,因为它不需要为它们构建索引。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) true
7.1 false

lib 目录不受此标志的影响,它始终添加到 $LOAD_PATH 中。

3.2.2. config.after_initialize

接受一个块,该块将在 Rails 完成应用程序初始化后运行。这包括框架本身的初始化、引擎以及 config/initializers 中所有应用程序的初始化器。请注意,此块将为 rake 任务运行。对于配置其他初始化器设置的值很有用

config.after_initialize do
  ActionView::Base.sanitized_allowed_tags.delete "div"
end

3.2.3. config.after_routes_loaded

接受一个块,该块将在 Rails 完成加载应用程序路由后运行。此块也将在路由重新加载时运行。

config.after_routes_loaded do
  # Code that does something with Rails.application.routes
end

3.2.4. config.allow_concurrency

控制请求是否应并发处理。仅当应用程序代码不是线程安全的时才应将其设置为 false。默认为 true

3.2.5. config.asset_host

设置资产的主机。当 CDN 用于托管资产,或者当您希望通过使用不同的域别名来绕过浏览器内置的并发限制时,此功能很有用。是 config.action_controller.asset_host 的较短版本。

3.2.6. config.assume_ssl

使应用程序认为所有请求都通过 SSL 到达。当通过终止 SSL 的负载均衡器代理时,转发的请求将显示为 HTTP 而不是 HTTPS 到应用程序。这会使重定向和 cookie 安全性目标为 HTTP 而不是 HTTPS。此中间件使服务器假设代理已经终止 SSL,并且请求确实是 HTTPS。

3.2.7. config.autoflush_log

启用立即写入日志文件输出而不是缓冲。默认为 true

3.2.8. config.autoload_lib(ignore:)

此方法将 lib 添加到 config.autoload_pathsconfig.eager_load_paths

通常,lib 目录包含不应自动加载或急切加载的子目录。请在必需的 ignore 关键字参数中传入它们相对于 lib 的名称。例如,

config.autoload_lib(ignore: %w(assets tasks generators))

有关详细信息,请参阅自动加载指南

3.2.9. config.autoload_lib_once(ignore:)

方法 config.autoload_lib_once 类似于 config.autoload_lib,不同之处在于它将 lib 添加到 config.autoload_once_paths

通过调用 config.autoload_lib_oncelib 中的类和模块可以自动加载,甚至可以从应用程序初始化器中加载,但不会重新加载。

3.2.10. config.autoload_once_paths

接受一个路径数组,Rails 将从这些路径自动加载不会在每个请求中清除的常量。如果启用了重新加载(在 development 环境中默认启用),则此功能相关。否则,所有自动加载只发生一次。此数组的所有元素也必须在 autoload_paths 中。默认值为空数组。

3.2.11. config.autoload_paths

接受一个路径数组,Rails 将从这些路径自动加载常量。默认值为空数组。自 Rails 6 起,不建议调整此设置。请参阅 自动加载和重新加载常量

3.2.12. config.beginning_of_week

设置应用程序的默认一周开始日期。接受有效的星期几符号(例如 :monday)。

3.2.13. config.cache_classes

!config.enable_reloading 等效的旧设置。为了向后兼容而支持。

3.2.14. config.cache_store

配置用于 Rails 缓存的缓存存储。选项包括符号 :memory_store:file_store:mem_cache_store:null_store:redis_cache_store 之一,或实现缓存 API 的对象。默认为 :file_store。有关每个存储的配置选项,请参阅 缓存存储

3.2.15. config.colorize_logging

指定在记录信息时是否使用 ANSI 颜色代码。默认为 true

3.2.16. config.consider_all_requests_local

是一个标志。如果为 true,则任何错误都会导致详细的调试信息倾倒到 HTTP 响应中,并且 Rails::Info 控制器将在 /rails/info/properties 中显示应用程序运行时上下文。在开发和测试环境中默认为 true,在生产环境中为 false。为了更精细的控制,将其设置为 false 并在控制器中实现 show_detailed_exceptions? 以指定哪些请求应在错误时提供调试信息。

3.2.17. config.console

允许您设置运行 bin/rails console 时用作控制台的类。最好在 console 块中运行

console do
  # this block is called only when running console,
  # so we can safely require pry here
  require "pry"
  config.console = Pry
end

3.2.18. config.content_security_policy_nonce_auto

请参阅安全指南中的添加 Nonce

3.2.19. config.content_security_policy_nonce_directives

请参阅安全指南中的添加 Nonce

3.2.20. config.content_security_policy_nonce_generator

请参阅安全指南中的添加 Nonce

3.2.21. config.content_security_policy_report_only

请参阅安全指南中的报告违规

3.2.22. config.credentials.content_path

加密凭据文件的路径。

如果 config/credentials/#{Rails.env}.yml.enc 存在,则默认为该路径,否则为 config/credentials.yml.enc

为了让 bin/rails credentials 命令识别此值,必须在 config/application.rbconfig/environments/#{Rails.env}.rb 中设置。

3.2.23. config.credentials.key_path

加密凭据密钥文件的路径。

如果 config/credentials/#{Rails.env}.key 存在,则默认为该路径,否则为 config/master.key

为了让 bin/rails credentials 命令识别此值,必须在 config/application.rbconfig/environments/#{Rails.env}.rb 中设置。

3.2.24. config.debug_exception_response_format

设置开发环境中发生错误时响应中使用的格式。对于纯 API 应用程序默认为 :api,对于普通应用程序默认为 :default

3.2.25. config.disable_sandbox

控制是否有人可以以沙盒模式启动控制台。这有助于避免长时间运行的沙盒控制台会话,这可能导致数据库服务器内存不足。默认为 false

3.2.26. config.dom_testing_default_html_version

控制 Action View、Action Dispatch 和 rails-dom-testing 中的测试助手默认使用 HTML4 解析器还是 HTML5 解析器。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) :html4
7.1 :html5 (参见注意)

Nokogiri 的 HTML5 解析器不支持 JRuby,因此在 JRuby 平台上,Rails 将回退到 :html4

3.2.27. config.eager_load

当为 true 时,急切加载所有注册的 config.eager_load_namespaces。这包括您的应用程序、引擎、Rails 框架和任何其他注册的命名空间。

3.2.28. config.eager_load_namespaces

注册当 config.eager_load 设置为 true 时急切加载的命名空间。列表中的所有命名空间必须响应 eager_load! 方法。

3.2.29. config.eager_load_paths

接受一个路径数组,如果 config.eager_load 为 true,Rails 将在启动时急切加载这些路径。默认为应用程序 app 目录中的每个文件夹。

3.2.30. config.enable_reloading

如果 config.enable_reloading 为 true,则应用程序类和模块在 Web 请求之间更改时会重新加载。在 development 环境中默认为 true,在 production 环境中为 false

谓词 config.reloading_enabled? 也已定义。

3.2.31. config.encoding

设置应用程序范围的编码。默认为 UTF-8。

3.2.32. config.exceptions_app

设置当发生异常时由 ShowException 中间件调用的异常应用程序。默认为 ActionDispatch::PublicExceptions.new(Rails.public_path)

3.2.33. config.file_watcher

是当 config.reload_classes_only_on_changetrue 时用于检测文件系统中文件更新的类。Rails 附带 ActiveSupport::FileUpdateChecker(默认)和 ActiveSupport::EventedFileUpdateChecker。自定义类必须符合 ActiveSupport::FileUpdateChecker API。

使用 ActiveSupport::EventedFileUpdateChecker 取决于 listen gem

group :development do
  gem "listen", "~> 3.5"
end

在 Linux 和 macOS 上不需要额外的 gem,但 对于 *BSD对于 Windows 需要一些。

请注意,某些设置不受支持

3.2.34. config.filter_parameters

用于过滤掉您不想在日志中显示的参数,例如密码或信用卡号。它还会过滤掉调用 Active Record 对象的 #inspect 时数据库列的敏感值。默认情况下,Rails 通过在 config/initializers/filter_parameter_logging.rb 中添加以下过滤器来过滤密码。

Rails.application.config.filter_parameters += [
  :passw, :email, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn, :cvv, :cvc
]

参数过滤器通过部分匹配正则表达式工作。

3.2.35. config.filter_redirect

用于从应用程序日志中过滤掉重定向 URL。

Rails.application.config.filter_redirect += ["s3.amazonaws.com", /private-match/]

重定向过滤器通过测试 URL 是否包含字符串或匹配正则表达式来工作。

3.2.36. config.force_ssl

强制所有请求通过 HTTPS 提供,并将 "https://" 设置为生成 URL 时的默认协议。HTTPS 的强制执行由 ActionDispatch::SSL 中间件处理,可以通过 config.ssl_options 进行配置。

3.2.37. config.helpers_paths

定义用于加载视图助手的额外路径数组。

3.2.38. config.host_authorization

接受一个哈希选项来配置 HostAuthorization 中间件

3.2.39. config.hosts

一个字符串、正则表达式或 IPAddr 数组,用于验证 Host 头。由 HostAuthorization 中间件 使用,以帮助防止 DNS 重绑定攻击。

3.2.40. config.javascript_path

设置您的应用程序 JavaScript 相对于 app 目录的路径,默认值为 javascript。应用程序配置的 javascript_path 将从 autoload_paths 中排除。

3.2.41. config.log_file_size

定义 Rails 日志文件的最大大小(以字节为单位)。在开发和测试环境中默认为 104_857_600 (100 MiB),在所有其他环境中无限制。

3.2.42. config.log_formatter

定义 Rails 记录器的格式化程序。此选项在所有环境中默认为 ActiveSupport::Logger::SimpleFormatter 的实例。如果您为 config.logger 设置了值,则必须在将记录器包装在 ActiveSupport::TaggedLogging 实例中之前手动将格式化程序的值传递给记录器,Rails 不会为您执行此操作。

3.2.43. config.log_level

定义 Rails 记录器的详细程度。此选项在生产环境之外的所有环境中默认为 :debug,在生产环境中默认为 :info。可用的日志级别有::debug:info:warn:error:fatal:unknown

3.2.44. config.log_tags

接受 request 对象响应的方法列表、接受 request 对象的 Proc 或响应 to_s 的内容。这使得用子域和请求 ID 等调试信息标记日志行变得容易——这在调试多用户生产应用程序中都非常有用。

3.2.45. config.logger

是将用于 Rails.logger 和任何相关 Rails 日志记录(例如 ActiveRecord::Base.logger)的记录器。它默认为 ActiveSupport::TaggedLogging 的一个实例,该实例包装了 ActiveSupport::Logger 的一个实例,该实例将日志输出到 log/ 目录。您可以提供自定义记录器,为了获得完全兼容性,您必须遵循以下准则

  • 要支持格式化程序,您必须手动将 config.log_formatter 值中的格式化程序分配给记录器。
  • 要支持带标签的日志,日志实例必须用 ActiveSupport::TaggedLogging 包装。
  • 要支持静默,记录器必须包含 ActiveSupport::LoggerSilence 模块。ActiveSupport::Logger 类已经包含这些模块。
class MyLogger < ::Logger
  include ActiveSupport::LoggerSilence
end

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

3.2.46. config.middleware

允许您配置应用程序的中间件。这将在下面的配置中间件部分中详细介绍。

3.2.47. config.precompile_filter_parameters

当为 true 时,将使用 ActiveSupport::ParameterFilter.precompile_filters 预编译 config.filter_parameters

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) false
7.1 true

3.2.48. config.public_file_server.enabled

配置 Rails 是否应从公共目录提供静态文件。默认为 true

如果服务器软件(例如 NGINX 或 Apache)应提供静态文件,请将此值设置为 false

3.2.49. config.railties_order

允许手动指定 Railties/Engines 的加载顺序。默认值为 [:all]

config.railties_order = [Blog::Engine, :main_app, :all]

3.2.50. config.rake_eager_load

当为 true 时,运行 Rake 任务时急切加载应用程序。默认为 false

3.2.51. config.relative_url_root

可用于告诉 Rails 您正在部署到子目录。默认值为 ENV['RAILS_RELATIVE_URL_ROOT']

3.2.52. config.reload_classes_only_on_change

启用或禁用仅当跟踪文件更改时才重新加载类。默认情况下,跟踪自动加载路径上的所有内容并设置为 true。如果 config.enable_reloadingfalse,则此选项将被忽略。

3.2.53. config.require_master_key

如果未通过 ENV["RAILS_MASTER_KEY"]config/master.key 文件提供主密钥,则应用程序将无法启动。

3.2.54. config.sandbox_by_default

当为 true 时,rails console 以沙盒模式启动。要以非沙盒模式启动 rails console,必须指定 --no-sandbox。这有助于避免意外写入生产数据库。默认为 false

3.2.55. config.secret_key_base

用于指定应用程序密钥生成器的输入秘密的备用。建议将其保留未设置,而是在 config/credentials.yml.enc 中指定 secret_key_base。有关更多信息和替代配置方法,请参阅 secret_key_base API 文档

3.2.56. config.server_timing

当为 true 时,将 ServerTiming 中间件 添加到中间件堆栈中。默认为 false,但在默认生成的 config/environments/development.rb 文件中设置为 true

3.2.57. config.session_options

传递给 config.session_store 的其他选项。您应该使用 config.session_store 来设置它,而不是自己修改它。

config.session_store :cookie_store, key: "_your_app_session"
config.session_options # => {key: "_your_app_session"}

3.2.58. config.session_store

指定用于存储会话的类。可能的值有 :cache_store:cookie_store:mem_cache_store、自定义存储或 :disabled:disabled 告诉 Rails 不处理会话。

此设置通过常规方法调用而不是 setter 进行配置。这允许传递其他选项

config.session_store :cookie_store, key: "_your_app_session"

如果自定义存储指定为符号,它将在 ActionDispatch::Session 命名空间中解析

# use ActionDispatch::Session::MyCustomStore as the session store
config.session_store :my_custom_store

默认存储是一个 cookie 存储,以应用程序名称作为会话密钥。

3.2.59. config.silence_healthcheck_path

指定应在日志中静默的健康检查路径。使用 Rails::Rack::SilenceRequest 实现静默。所有这些都是为了防止健康检查堵塞生产日志,特别是对于早期应用程序。

config.silence_healthcheck_path = "/up"

3.2.60. config.ssl_options

ActionDispatch::SSL 中间件的配置选项。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) {}
5.0 { hsts: { subdomains: true } }

3.2.61. config.time_zone

设置应用程序的默认时区并为 Active Record 启用时区感知。

3.2.62. config.x

用于轻松地向应用程序配置对象添加嵌套的自定义配置

  config.x.payment_processing.schedule = :daily
  Rails.configuration.x.payment_processing.schedule # => :daily

请参阅自定义配置

3.2.63. config.yjit

从 Ruby 3.3 开始启用 YJIT,以带来显着的性能提升。如果您部署到内存受限的环境,您可能需要将其设置为 false。此外,您可以传递一个哈希来配置 YJIT 选项,例如 { stats: true }

从版本开始 默认值为
(原始) false
7.2 true
8.1 !Rails.env.local?

3.3. 配置资产

3.3.1. config.assets.css_compressor

定义要使用的 CSS 压缩器。默认由 sass-rails 设置。目前唯一的替代值是 :yui,它使用 yui-compressor gem。

3.3.2. config.assets.js_compressor

定义要使用的 JavaScript 压缩器。可能的值有 :terser:closure:uglifier:yui,它们分别需要使用 terserclosure-compileruglifieryui-compressor gem。

3.3.3. config.assets.gzip

一个标志,启用创建已编译资产的 gzipped 版本以及非 gzipped 资产。默认为 true

3.3.4. config.assets.paths

包含用于查找资产的路径。将路径附加到此配置选项将导致这些路径用于搜索资产。

3.3.5. config.assets.precompile

允许您指定在运行 bin/rails assets:precompile 时要预编译的其他资产(除了 application.cssapplication.js)。

3.3.6. config.assets.unknown_asset_fallback

如果您使用 sprockets-rails 3.2.0 或更高版本,则允许您修改资产不在管道中时资产管道的行为。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) true
5.1 false

3.3.7. config.assets.prefix

定义提供资产的前缀。默认为 /assets

3.3.8. config.assets.manifest

定义用于资产预编译器的清单文件的完整路径。默认为公共文件夹内 config.assets.prefix 目录中的一个名为 manifest-<random>.json 的文件。

3.3.9. config.assets.digest

启用在资产名称中使用 SHA256 指纹。默认为 true

3.3.10. config.assets.debug

禁用资产的连接和压缩。

3.3.11. config.assets.version

是用于 SHA256 哈希生成的可选字符串。可以更改此项以强制重新编译所有文件。

3.3.12. config.assets.compile

是一个布尔值,可用于在生产环境中开启实时 Sprockets 编译。

3.3.13. config.assets.logger

接受符合 Log4r 接口或默认 Ruby Logger 类的记录器。默认为 config.logger 中配置的相同。将 config.assets.logger 设置为 false 将关闭服务资产的日志记录。

3.3.14. config.assets.quiet

禁用资产请求的日志记录。在 config/environments/development.rb 中默认为 true

3.4. 配置生成器

Rails 允许您使用 config.generators 方法更改所使用的生成器。此方法接受一个块

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 定义使用 bin/rails generate resource 时用于生成控制器的生成器。默认为 :controller
  • resource_route 定义是否应生成资源路由定义。默认为 true
  • scaffold_controllerresource_controller 不同,定义使用 bin/rails generate scaffold 时用于生成脚手架控制器的生成器。默认为 :scaffold_controller
  • test_framework 定义要使用的测试框架。默认为 false,默认将使用 minitest。
  • template_engine 定义要使用的模板引擎,例如 ERB 或 Haml。默认为 :erb
  • apply_rubocop_autocorrect_after_generate! 在 Rails 生成器运行后应用 RuboCop 的自动更正功能。

3.5. 配置中间件

每个 Rails 应用程序都带有一组标准的中间件,它在开发环境中按此顺序使用

3.5.1. ActionDispatch::HostAuthorization

防止 DNS 重绑定和其他 Host 头攻击。它在开发环境中默认包含,具有以下配置

Rails.application.config.hosts = [
  IPAddr.new("0.0.0.0/0"),        # All IPv4 addresses.
  IPAddr.new("::/0"),             # All IPv6 addresses.
  "localhost",                    # The localhost reserved domain.
  ENV["RAILS_DEVELOPMENT_HOSTS"]  # Additional comma-separated hosts for development.
]

在其他环境中,Rails.application.config.hosts 为空,并且不会执行任何 Host 头检查。如果您想在生产环境中防范头攻击,您必须手动允许允许的主机

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

请求的主机使用 case 运算符 (#===) 与 hosts 条目进行检查,这使得 hosts 支持 RegexpProcIPAddr 等类型的条目。以下是一个使用正则表达式的示例。

# Allow requests from subdomains like `www.product.com` and
# `beta1.product.com`.
Rails.application.config.hosts << /.*\.product\.com/

提供的正则表达式将被两个锚点(\A\z)包装,因此它必须匹配整个主机名。例如,/product.com/ 一旦锚定,将无法匹配 www.product.com

支持一种特殊情况,允许您允许域和所有子域

# Allow requests from the domain itself `product.com` and subdomains like `www.product.com` and `beta1.product.com`.
Rails.application.config.hosts << ".product.com"

您可以通过设置 config.host_authorization.exclude 将某些请求从主机授权检查中排除

# Exclude requests for the /healthcheck/ path from host checking
Rails.application.config.host_authorization = {
  exclude: ->(request) { request.path.include?("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.5.2. ActionDispatch::ServerTiming

Server-Timing 头添加到响应中,其中包含来自服务器的性能指标。可以通过浏览器开发者工具的网络面板检查响应来查看这些数据。大多数浏览器提供一个“计时”选项卡,可将数据显示可视化。

3.5.3. ActionDispatch::SSL

强制每个请求都使用 HTTPS 提供。如果 config.force_ssl 设置为 true,则启用。传递给它的选项可以通过设置 config.ssl_options 进行配置。

3.5.4. ActionDispatch::Static

用于提供静态资产。如果 config.public_file_server.enabledfalse,则禁用。如果您需要提供非 index 命名的静态目录索引文件,请设置 config.public_file_server.index_name。例如,要为目录请求提供 main.html 而不是 index.html,请将 config.public_file_server.index_name 设置为 "main"

3.5.5. ActionDispatch::Executor

允许线程安全代码重新加载。如果 config.allow_concurrencyfalse,则禁用,这会导致加载 Rack::LockRack::Lock 将应用程序包装在互斥锁中,因此它一次只能由一个线程调用。

3.5.6. ActiveSupport::Cache::Strategy::LocalCache

充当基本的内存支持缓存。此缓存不是线程安全的,仅用于作为单个线程的临时内存缓存。

3.5.7. Rack::Runtime

设置一个 X-Runtime 头,其中包含执行请求所花费的时间(以秒为单位)。

3.5.8. Rails::Rack::Logger

通知日志请求已开始。请求完成后,刷新所有日志。

3.5.9. ActionDispatch::ShowExceptions

捕获应用程序返回的任何异常,如果请求是本地的或 config.consider_all_requests_local 设置为 true,则渲染漂亮的异常页面。如果 config.action_dispatch.show_exceptions 设置为 :none,则无论如何都会引发异常。

3.5.10. ActionDispatch::RequestId

使唯一的 X-Request-Id 头可用于响应,并启用 ActionDispatch::Request#uuid 方法。可通过 config.action_dispatch.request_id_header 进行配置。

3.5.11. ActionDispatch::RemoteIp

检查 IP 欺骗攻击并从请求头中获取有效的 client_ip。可通过 config.action_dispatch.ip_spoofing_checkconfig.action_dispatch.trusted_proxies 选项进行配置。

3.5.12. Rack::Sendfile

拦截其主体由文件提供的响应,并将其替换为服务器特定的 X-Sendfile 头。可通过 config.action_dispatch.x_sendfile_header 进行配置。

3.5.13. ActionDispatch::Callbacks

在处理请求之前运行准备回调。

3.5.14. ActionDispatch::Cookies

为请求设置 cookie。

3.5.15. ActionDispatch::Session::CookieStore

负责将会话存储在 cookie 中。可以通过更改 config.session_store 来使用替代中间件。

3.5.16. ActionDispatch::Flash

设置 flash 键。仅当 config.session_store 设置为某个值时才可用。

3.5.17. Rack::MethodOverride

如果设置了 params[:_method],则允许覆盖方法。这是支持 PATCH、PUT 和 DELETE HTTP 方法类型的中间件。

3.5.18. Rack::Head

对于所有 HEAD 请求返回空主体。它保持所有其他请求不变。

3.5.19. 添加自定义中间件

除了这些常用中间件之外,您还可以通过使用 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.6. 配置 i18n

所有这些配置选项都委托给 I18n 库。

3.6.1. config.i18n.available_locales

定义应用程序允许的可用语言环境。默认为语言环境文件中找到的所有语言环境键,新应用程序通常只有 :en

3.6.2. config.i18n.default_locale

设置用于 i18n 的应用程序的默认语言环境。默认为 :en

3.6.3. config.i18n.enforce_available_locales

确保通过 i18n 传递的所有语言环境都必须在 available_locales 列表中声明,在设置不可用语言环境时引发 I18n::InvalidLocale 异常。默认为 true。除非强烈需要,否则不建议禁用此选项,因为这是一种防止从用户输入设置任何无效语言环境的安全措施。

3.6.4. config.i18n.load_path

设置 Rails 用于查找语言环境文件的路径。默认为 config/locales/**/*.{yml,rb}

3.6.5. config.i18n.raise_on_missing_translations

确定是否应为缺失的翻译引发错误。如果为 true,则视图和控制器会引发 I18n::MissingTranslationData。如果为 :strict,则模型也会引发错误。这默认为 false

3.6.6. config.i18n.fallbacks

为缺失的翻译设置回退行为。以下是此选项的 3 个用法示例

  • 您可以将选项设置为 true 以使用默认语言环境作为回退,如下所示

    config.i18n.fallbacks = true
    
  • 或者您可以设置一个语言环境数组作为回退,如下所示

    config.i18n.fallbacks = [:tr, :en]
    
  • 或者您可以为每个语言环境单独设置不同的回退。例如,如果您想将 :tr 用于 :az,将 :de:en 用于 :da 作为回退,您可以这样做

    config.i18n.fallbacks = { az: :tr, da: [:de, :en] }
    #or
    config.i18n.fallbacks.map = { az: :tr, da: [:de, :en] }
    

3.7. 配置 Active Model

3.7.1. config.active_model.i18n_customize_full_message

控制 Error#full_message 格式是否可以在 i18n 语言环境文件中被覆盖。默认为 false

当设置为 true 时,full_message 将在语言环境文件的属性和模型级别查找格式。默认格式为 "%{attribute} %{message}",其中 attribute 是属性的名称,message 是特定于验证的消息。以下示例覆盖了所有 Person 属性的格式,以及特定 Person 属性 (age) 的格式。

class Person
  include ActiveModel::Validations

  attr_accessor :name, :age

  validates :name, :age, presence: true
end
en:
  activemodel: # or activerecord:
    errors:
      models:
        person:
          # Override the format for all Person attributes:
          format: "Invalid %{attribute} (%{message})"
          attributes:
            age:
              # Override the format for the age attribute:
              format: "%{message}"
              blank: "Please fill in your %{attribute}"
irb> person = Person.new.tap(&:valid?)

irb> person.errors.full_messages
=> [
  "Invalid Name (can't be blank)",
  "Please fill in your Age"
]

irb> person.errors.messages
=> {
  :name => ["can't be blank"],
  :age  => ["Please fill in your Age"]
}

3.8. 配置 Active Record

config.active_record 包含各种配置选项

3.8.1. config.active_record.logger

接受符合 Log4r 接口或默认 Ruby Logger 类的记录器,然后将其传递给任何新的数据库连接。您可以通过在 Active Record 模型类或 Active Record 模型实例上调用 logger 来检索此记录器。设置为 nil 可禁用日志记录。

3.8.2. config.active_record.primary_key_prefix_type

允许您调整主键列的命名。默认情况下,Rails 假设主键列名为 id(此配置选项不需要设置)。还有另外两个选择

  • :table_name 将使 Customer 类的主键为 customerid
  • :table_name_with_underscore 将使 Customer 类的主键为 customer_id

3.8.3. config.active_record.table_name_prefix

允许您设置一个全局字符串,作为表名的前缀。如果您将其设置为 northwest_,则 Customer 类将查找 northwest_customers 作为其表。默认值为空字符串。

3.8.4. config.active_record.table_name_suffix

允许您设置一个全局字符串,作为表名的后缀。如果您将其设置为 _northwest,则 Customer 类将查找 customers_northwest 作为其表。默认值为空字符串。

3.8.5. config.active_record.schema_migrations_table_name

允许您设置一个字符串,用作 schema 迁移表的名称。

3.8.6. config.active_record.internal_metadata_table_name

允许您设置一个字符串,用作内部元数据表的名称。

3.8.7. config.active_record.protected_environments

允许您设置一个环境名称数组,其中应禁止破坏性操作。

3.8.8. config.active_record.pluralize_table_names

指定 Rails 是否在数据库中查找单数或复数表名。如果设置为 true(默认值),则 Customer 类将使用 customers 表。如果设置为 false,则 Customer 类将使用 customer 表。

一些 Rails 生成器和安装程序(特别是 active_storage:installaction_text:install)无论此设置如何,都会创建复数表名。如果将 pluralize_table_names 设置为 false,则需要在安装后手动重命名这些表以保持一致性。此限制的存在是因为这些安装程序在迁移中使用固定的表名以实现兼容性。

3.8.9. config.active_record.default_timezone

确定从数据库中提取日期和时间时使用 Time.local(如果设置为 :local)还是 Time.utc(如果设置为 :utc)。默认值为 :utc

3.8.10. config.active_record.schema_format

控制将数据库 schema 倾倒到文件的格式。选项是 :ruby(默认),用于依赖迁移的独立于数据库的版本,或 :sql,用于一组(可能依赖于数据库的)SQL 语句。可以通过在数据库配置中设置 schema_format 来覆盖每个数据库的此设置。

3.8.11. config.active_record.error_on_ignored_order

指定如果在批处理查询期间忽略查询的顺序是否应引发错误。选项为 true(引发错误)或 false(警告)。默认值为 false

3.8.12. config.active_record.timestamped_migrations

控制迁移是否使用序列整数或时间戳进行编号。默认值为 true,使用时间戳,如果多个开发人员在同一个应用程序上工作,则首选时间戳。

3.8.13. config.active_record.automatically_invert_plural_associations

控制 Active Record 是否自动查找具有复数名称的反向关系。

示例

class Post < ApplicationRecord
  has_many :comments
end

class Comment < ApplicationRecord
  belongs_to :post
end

在上述情况下,Active Record 过去只会在 Post 中查找 :comment(单数)关联,并且找不到它。

启用此选项后,它还会查找 :comments 关联。在绝大多数情况下,发现反向关联是有益的,因为它可以防止一些无用的查询,但它可能会导致与不期望它的旧代码的向后兼容性问题。

此行为可以按模型禁用

class Comment < ApplicationRecord
  self.automatically_invert_plural_associations = false

  belongs_to :post
end

并按关联禁用

class Comment < ApplicationRecord
  self.automatically_invert_plural_associations = true

  belongs_to :post, inverse_of: nil
end
从版本开始 默认值为
(原始) false

3.8.14. config.active_record.validate_migration_timestamps

控制是否验证迁移时间戳。设置后,如果迁移的时间戳前缀比当前时间关联的时间戳提前超过一天,则会引发错误。这样做是为了防止迁移文件前置日期,这可能会影响迁移生成和其他迁移命令。config.active_record.timestamped_migrations 必须设置为 true

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) false
7.2 true

3.8.15. config.active_record.db_warnings_action

控制当 SQL 查询产生警告时要采取的操作。以下选项可用

  • :ignore - 数据库警告将被忽略。这是默认值。

  • :log - 数据库警告将通过 ActiveRecord.logger:warn 级别记录。

  • :raise - 数据库警告将作为 ActiveRecord::SQLWarning 引发。

  • :report - 数据库警告将报告给 Rails 错误报告器的订阅者。

  • 自定义 proc - 可以提供自定义 proc。它应该接受一个 SQLWarning 错误对象。

    例如

    config.active_record.db_warnings_action = ->(warning) do
      # Report to custom exception reporting service
      Bugsnag.notify(warning.message) do |notification|
        notification.add_metadata(:warning_code, warning.code)
        notification.add_metadata(:warning_level, warning.level)
      end
    end
    

3.8.16. config.active_record.db_warnings_ignore

指定一个警告代码和消息的允许列表,无论配置的 db_warnings_action 如何,这些警告都将被忽略。默认行为是报告所有警告。要忽略的警告可以指定为字符串或正则表达式。例如

  config.active_record.db_warnings_action = :raise
  # The following warnings will not be raised
  config.active_record.db_warnings_ignore = [
    /Invalid utf8mb4 character string/,
    "An exact warning message",
    "1062", # MySQL Error 1062: Duplicate entry
  ]

3.8.17. config.active_record.migration_strategy

控制在迁移中执行 schema 语句方法所使用的策略类。默认类委托给连接适配器。自定义策略应继承自 ActiveRecord::Migration::ExecutionStrategy,或者可以继承自 DefaultStrategy,这将保留未实现方法的默认行为

class CustomMigrationStrategy < ActiveRecord::Migration::DefaultStrategy
  def drop_table(*)
    raise "Dropping tables is not supported!"
  end
end

config.active_record.migration_strategy = CustomMigrationStrategy

3.8.18. config.active_record.schema_versions_formatter

控制 schema dumper 用于格式化版本信息的格式化程序类。可以提供自定义类以更改默认行为

class CustomSchemaVersionsFormatter
  def initialize(connection)
    @connection = connection
  end

  def format(versions)
    # Special sorting of versions to reduce the likelihood of conflicts.
    sorted_versions = versions.sort { |a, b| b.to_s.reverse <=> a.to_s.reverse }

    sql = +"INSERT INTO schema_migrations (version) VALUES\n"
    sql << sorted_versions.map { |v| "(#{@connection.quote(v)})" }.join(",\n")
    sql << ";"
    sql
  end
end

config.active_record.schema_versions_formatter = CustomSchemaVersionsFormatter

3.8.19. config.active_record.lock_optimistically

控制 Active Record 是否使用乐观锁定,默认值为 true

3.8.20. config.active_record.cache_timestamp_format

控制缓存键中时间戳值的格式。默认为 :usec

3.8.21. config.active_record.record_timestamps

是一个布尔值,控制是否在模型上进行 createupdate 操作的时间戳记录。默认值为 true

3.8.22. config.active_record.partial_inserts

是一个布尔值,控制在创建新记录时是否使用部分写入(即插入是否只设置与默认值不同的属性)。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) true
7.0 false

3.8.23. config.active_record.partial_updates

是一个布尔值,控制在更新现有记录时是否使用部分写入(即更新是否只设置脏属性)。请注意,当使用部分更新时,您还应该使用乐观锁定 config.active_record.lock_optimistically,因为并发更新可能会根据可能过时的读取状态写入属性。默认值为 true

3.8.24. config.active_record.maintain_test_schema

是一个布尔值,控制 Active Record 在运行测试时是否应尝试使您的测试数据库 schema 与 db/schema.rb(或 db/structure.sql)保持最新。默认值为 true

3.8.25. config.active_record.dump_schema_after_migration

是一个标志,控制在运行迁移时是否应进行 schema 倾倒(db/schema.rbdb/structure.sql)。在 Rails 生成的 config/environments/production.rb 中,此设置为 false。如果未设置此配置,则默认值为 true

3.8.26. config.active_record.dump_schemas

控制调用 db:schema:dump 时将倾倒哪些数据库 schema。选项是 :schema_search_path(默认),它倾倒 schema_search_path 中列出的任何 schema,:all,它始终倾倒所有 schema,无论 schema_search_path 如何,或逗号分隔的 schema 字符串。

3.8.27. config.active_record.before_committed_on_all_records

启用在事务中所有已登记记录上调用 before_committed! 回调。以前的行为是,如果事务中登记了同一记录的多个副本,则仅在记录的第一个副本上运行回调。

从版本开始 默认值为
(原始) false
7.1 true

3.8.28. config.active_record.belongs_to_required_by_default

是一个布尔值,控制如果 belongs_to 关联不存在,记录是否验证失败。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) nil
5.0 true

3.8.29. config.active_record.belongs_to_required_validates_foreign_key

当父级强制时,启用仅验证与父级相关的列的存在性。以前的行为是验证父记录的存在性,这会在每次更新子记录时执行额外的查询以获取父级,即使父级未更改。

从版本开始 默认值为
(原始) true
7.1 false

3.8.30. config.active_record.marshalling_format_version

当设置为 7.1 时,启用使用 Marshal.dump 更高效地序列化 Active Record 实例。

这会更改序列化格式,因此以这种方式序列化的模型无法被旧版本(< 7.1)的 Rails 读取。但是,无论是否启用此优化,使用旧格式的消息仍然可以读取。

从版本开始 默认值为
(原始) 6.1
7.1 7.1

3.8.31. config.active_record.action_on_strict_loading_violation

如果在一个关联上设置了 strict_loading,则启用引发或记录异常。在所有环境中默认值为 :raise。可以更改为 :log,将违规发送到记录器而不是引发。

3.8.32. config.active_record.strict_loading_by_default

是一个布尔值,默认启用或禁用严格加载模式。默认为 false

3.8.33. config.active_record.strict_loading_mode

设置严格加载报告的模式。默认为 :all。可以更改为 :n_plus_one_only,仅当加载将导致 N + 1 查询的关联时才报告。

3.8.34. config.active_record.index_nested_attribute_errors

允许嵌套 has_many 关系的错误显示索引以及错误。默认为 false

3.8.35. config.active_record.use_schema_cache_dump

允许用户从 db/schema_cache.yml(由 bin/rails db:schema:cache:dump 生成)获取 schema 缓存信息,而无需向数据库发送查询以获取此信息。默认为 true

3.8.36. config.active_record.cache_versioning

指示是否使用稳定的 #cache_key 方法,并伴随 #cache_version 方法中的更改版本。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) false
5.2 true

3.8.37. config.active_record.collection_cache_versioning

通过将关系缓存键的易失性信息(最大更新时间和计数)移动到缓存版本中,从而支持缓存键重用,即使缓存的对象类型为 ActiveRecord::Relation 发生更改。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) false
6.0 true

3.8.38. config.active_record.has_many_inversing

启用在遍历 belongs_tohas_many 关联时设置反向记录。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) false
6.1 true

3.8.39. config.active_record.automatic_scope_inversing

启用自动推断带范围关联的 inverse_of

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) false
7.0 true

3.8.40. config.active_record.destroy_association_async_job

允许指定用于在后台销毁关联记录的作业。默认值为 ActiveRecord::DestroyAssociationAsyncJob

3.8.41. config.active_record.destroy_association_async_batch_size

允许指定通过 dependent: :destroy_async 关联选项在后台作业中销毁的最大记录数。在其他条件相同的情况下,较低的批次大小将排队更多、运行时间更短的后台作业,而较高的批次大小将排队更少、运行时间更长的后台作业。此选项默认为 nil,这将导致给定关联的所有依赖记录在同一后台作业中销毁。

3.8.42. config.active_record.queues.destroy

允许指定用于销毁作业的 Active Job 队列。当此选项为 nil 时,清除作业将发送到默认的 Active Job 队列(参见 config.active_job.default_queue_name)。默认值为 nil

3.8.43. config.active_record.enumerate_columns_in_select_statements

当为 true 时,将始终在 SELECT 语句中包含列名,并避免通配符 SELECT * FROM ... 查询。这可以避免例如在 PostgreSQL 数据库中添加列时出现的预处理语句缓存错误。默认为 false

3.8.44. config.active_record.verify_foreign_keys_for_fixtures

确保在测试中加载 fixture 后所有外键约束都有效。仅 PostgreSQL 和 SQLite 支持。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) false
7.0 true

3.8.45. config.active_record.raise_on_assign_to_attr_readonly

启用在赋值给 attr_readonly 属性时引发错误。以前的行为允许赋值,但会悄悄地不将更改持久化到数据库。

从版本开始 默认值为
(原始) false
7.1 true

3.8.46. config.active_record.run_commit_callbacks_on_first_saved_instances_in_transaction

当多个 Active Record 实例在事务中更改同一条记录时,Rails 只会为其中一个实例运行 after_commitafter_rollback 回调。此选项指定 Rails 如何选择哪个实例接收回调。

当为 true 时,事务性回调在第一个保存的实例上运行,即使其实例状态可能已过时。

当为 false 时,事务性回调在具有最新实例状态的实例上运行。这些实例的选择方式如下

  • 通常,事务性回调在事务中保存给定记录的最后一个实例上运行。
  • 有两个例外
    • 如果在事务中创建记录,然后由另一个实例更新,则 after_create_commit 回调将在第二个实例上运行。这取代了本来会根据该实例状态运行的 after_update_commit 回调。
    • 如果记录在事务中销毁,则 after_destroy_commit 回调将在最后一个销毁的实例上触发,即使过时的实例随后执行了更新(这将影响 0 行)。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) true
7.1 false

3.8.47. config.active_record.default_column_serializer

如果未明确指定给定列的序列化器实现,则使用此序列化器实现。

历史上,serializestore 在允许使用替代的序列化器实现时,默认使用 YAML,但它不是一种非常高效的格式,如果使用不当,可能会成为安全漏洞的来源。

因此,建议数据库序列化优先选择更严格、更有限的格式。

不幸的是,Ruby 的标准库中并没有真正适合的默认值。JSON 可以作为一种格式,但 json gem 会将不支持的类型转换为字符串,这可能会导致错误。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) YAML
7.1 nil

3.8.48. config.active_record.run_after_transaction_callbacks_in_order_defined

当为 true 时,after_commit 回调将按照它们在模型中定义的顺序执行。当为 false 时,它们将按相反的顺序执行。

所有其他回调总是按照它们在模型中定义的顺序执行(除非你使用 prepend: true)。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) false
7.1 true

3.8.49. config.active_record.query_log_tags_enabled

指定是否启用适配器级别的查询注释。默认为 false,但在默认生成的 config/environments/development.rb 文件中设置为 true

当此设置为 true 时,数据库预处理语句将自动禁用。

3.8.50. config.active_record.query_log_tags

定义一个 Array,指定要插入到 SQL 注释中的键/值标签。默认为 [ :application, :controller, :action, :job ]。可用标签为::application:controller:namespaced_controller:action:job:source_location

计算查询的 :source_location 可能会很慢,因此如果在生产环境中使用它,应该考虑其影响。

3.8.51. config.active_record.query_log_tags_format

一个 Symbol,指定用于标签的格式化器。有效值为 :sqlcommenter:legacy

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) :legacy
7.1 :sqlcommenter

3.8.52. config.active_record.cache_query_log_tags

指定是否启用查询日志标签缓存。对于有大量查询的应用程序,当请求或作业执行的生命周期内上下文不改变时,缓存查询日志标签可以提供性能优势。默认为 false

3.8.53. config.active_record.query_log_tags_prepend_comment

指定是否将查询日志标签注释前置到查询中。

默认情况下,注释附加在查询的末尾。某些数据库(例如 MySQL)会截断查询文本。慢查询日志和查询某些 InnoDB 内部表的结果中,当查询长度超过 1024 字节时,就会出现这种情况。为了不丢失查询中的日志标签注释,可以使用此选项前置注释。

默认为 false

3.8.54. config.active_record.schema_cache_ignored_tables

定义在生成 schema 缓存时应忽略的表列表。它接受一个由字符串(表示表名)或正则表达式组成的 Array

3.8.55. config.active_record.verbose_query_logs

指定是否应在相关查询下方记录调用数据库查询的方法的源位置。默认情况下,在开发环境中该标志为 true,在所有其他环境中为 false

3.8.56. config.active_record.sqlite3_adapter_strict_strings_by_default

指定 SQLite3Adapter 是否应在严格字符串模式下使用。使用严格字符串模式会禁用双引号字符串文字。

SQLite 在双引号字符串文字方面有一些怪癖。它首先尝试将双引号字符串视为标识符名称,但如果它们不存在,则将其视为字符串文字。因此,拼写错误可能会悄无声息地被忽略。例如,可以为不存在的列创建索引。有关更多详细信息,请参阅 SQLite 文档

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) false
7.1 true

3.8.57. config.active_record.postgresql_adapter_decode_dates

指定 PostgresqlAdapter 是否应解码日期列。

ActiveRecord::Base.connection
     .select_value("select '2024-01-01'::date").class #=> Date

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) false
7.2 true

3.8.58. config.active_record.async_query_executor

指定异步查询如何池化。

它默认为 nil,这意味着 load_async 被禁用,并直接在前台执行查询。要使查询实际异步执行,必须将其设置为 :global_thread_pool:multi_thread_pool

:global_thread_pool 将为应用程序连接的所有数据库使用一个单一池。这是只有一个数据库的应用程序或一次只查询一个数据库分片的应用程序的首选配置。

:multi_thread_pool 将为每个数据库使用一个池,每个池的大小可以在 database.yml 中通过 max_threadsmin_threads 属性单独配置。这对于定期同时查询多个数据库并需要更精确定义最大并发性的应用程序很有用。

3.8.59. config.active_record.global_executor_concurrency

config.active_record.async_query_executor = :global_thread_pool 结合使用,定义可以并发执行多少个异步查询。

默认为 4

此数字必须与 database.yml 中配置的数据库连接池大小一起考虑。连接池应足够大,以容纳前台线程(即 Web 服务器或作业工作线程)和后台线程。

对于每个进程,Rails 将创建一个全局查询执行器,它使用此数量的线程来处理异步查询。因此,池大小应至少为 thread_count + global_executor_concurrency + 1。例如,如果您的 Web 服务器最多有 3 个线程,并且 global_executor_concurrency 设置为 4,那么您的池大小应至少为 8。

3.8.60. config.active_record.yaml_column_permitted_classes

默认为 [Symbol]。允许应用程序在 ActiveRecord::Coders::YAMLColumn 上包含额外的允许类到 safe_load()

3.8.61. config.active_record.use_yaml_unsafe_load

默认为 false。允许应用程序选择在 ActiveRecord::Coders::YAMLColumn 上使用 unsafe_load

3.8.62. config.active_record.raise_int_wider_than_64bit

默认为 true。确定当 PostgreSQL 适配器提供一个宽度大于有符号 64 位表示的整数时是否引发异常。

3.8.63. config.active_record.generate_secure_token_on

控制何时为 has_secure_token 声明生成值。默认情况下,在模型初始化时生成值。

class User < ApplicationRecord
  has_secure_token
end

record = User.new
record.token # => "fwZcXX6SkJBJRogzMdciS7wf"

使用 config.active_record.generate_secure_token_on = :create,在创建模型时生成值。

# config/application.rb

config.active_record.generate_secure_token_on = :create

# app/models/user.rb
class User < ApplicationRecord
  has_secure_token on: :create
end

record = User.new
record.token # => nil
record.save!
record.token # => "fwZcXX6SkJBJRogzMdciS7wf"
从版本开始 默认值为
(原始) :create
7.1 :initialize

3.8.64. config.active_record.permanent_connection_checkout

控制 ActiveRecord::Base.connection 是抛出错误、发出弃用警告,还是两者都不做。

ActiveRecord::Base.connection 从连接池中取出数据库连接并保持租用直到请求或作业结束。在使用的线程或纤程远多于可用连接的环境中,这种行为可能是不受欢迎的。

此配置可用于跟踪并消除调用 ActiveRecord::Base.connection 的代码,并将其迁移到使用 ActiveRecord::Base.with_connection

该值可以设置为 :disallowed:deprecatedtrue,分别表示抛出错误、发出弃用警告或两者都不做。

从版本开始 默认值为
(原始) true

3.8.65. config.active_record.database_cli

控制运行 bin/rails dbconsole 时将使用哪个 CLI 工具访问数据库。默认情况下,将使用数据库的标准工具(例如,PostgreSQL 的 psql 和 MySQL 的 mysql)。此选项接受一个哈希,用于指定每个数据库系统的工具,并且在需要回退选项时可以使用数组。

# config/application.rb

config.active_record.database_cli = { postgresql: "pgcli", mysql: %w[ mycli mysql ] }

3.8.66. config.active_record.use_legacy_signed_id_verifier

控制是否使用旧选项生成和验证签名 ID。可设置为:

  • :generate_and_verify (默认) - 使用以下旧选项生成和验证签名 ID

    { digest: "SHA256", serializer: JSON, url_safe: true }
    
  • :verify - 使用 Rails.application.message_verifiers 中的选项生成和验证签名 ID,但回退到使用与 :generate_and_verify 相同的选项进行验证。

  • false - 仅使用 Rails.application.message_verifiers 中的选项生成和验证签名 ID。

此设置的目的是为所有消息验证器提供平稳的统一配置过渡。统一配置使得密钥轮换和签名算法升级更加简单。

如果未正确配置 Rails.application.message_verifiers,将此设置为 false 可能会导致旧的签名 ID 变得不可读。使用 MessageVerifiers#rotateMessageVerifiers#prepend 配置 Rails.application.message_verifiers,并附带适当的选项,例如 :digest:url_safe

3.8.67. ActiveRecord::ConnectionAdapters::Mysql2Adapter.emulate_booleansActiveRecord::ConnectionAdapters::TrilogyAdapter.emulate_booleans

控制 Active Record MySQL 适配器是否将所有 tinyint(1) 列视为布尔值。默认为 true

3.8.68. ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.create_unlogged_tables

控制 PostgreSQL 创建的数据库表是否应为“未日志记录”,这可以加快性能,但如果数据库崩溃,会增加数据丢失的风险。强烈建议不要在生产环境中启用此功能。在所有环境中默认为 false

要在测试中启用此功能

# config/environments/test.rb

ActiveSupport.on_load(:active_record_postgresqladapter) do
  self.create_unlogged_tables = true
end

3.8.69. ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.datetime_type

控制当你在迁移或 schema 中调用 datetime 时,Active Record PostgreSQL 适配器应使用哪个原生类型。它接受一个符号,该符号必须与配置的 NATIVE_DATABASE_TYPES 中的一个相对应。默认值为 :timestamp,这意味着迁移中的 t.datetime 将创建一个“不带时区的时间戳”列。

要使用“带时区的时间戳”

# config/application.rb

ActiveSupport.on_load(:active_record_postgresqladapter) do
  self.datetime_type = :timestamptz
end

如果更改此设置,您应该运行 bin/rails db:migrate 以重建您的 schema.rb。

3.8.70. ActiveRecord::SchemaDumper.ignore_tables

接受一个不应包含在任何生成的 schema 文件中的表数组。

3.8.71. ActiveRecord::SchemaDumper.fk_ignore_pattern

允许设置不同的正则表达式,该正则表达式将用于决定外键的名称是否应转储到 db/schema.rb。默认情况下,以 fk_rails_ 开头的外键名称不导出到数据库 schema 转储。默认为 /^fk_rails_[0-9a-f]{10}$/

3.8.72. config.active_record.encryption.add_to_filter_parameters

启用 inspect 上加密属性的自动过滤。

默认值为 true

3.8.73. config.active_record.encryption.hash_digest_class

设置 Active Record Encryption 使用的摘要算法。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) OpenSSL::Digest::SHA1
7.1 OpenSSL::Digest::SHA256

3.8.74. config.active_record.encryption.support_sha1_for_non_deterministic_encryption

启用对使用 SHA-1 摘要类加密的现有数据进行解密的支持。当为 false 时,它将只支持在 config.active_record.encryption.hash_digest_class 中配置的摘要。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) true
7.1 false

3.8.75. config.active_record.encryption.compressor

设置 Active Record Encryption 使用的压缩器。默认值为 Zlib

你可以通过将其设置为响应 deflateinflate 方法的类来使用自己的压缩器。

3.8.76. config.active_record.protocol_adapters

当使用 URL 配置数据库连接时,此选项提供了从协议到底层数据库适配器的映射。例如,这意味着环境可以指定 DATABASE_URL=mysql:///database,Rails 会将 mysql 映射到 mysql2 适配器,但应用程序也可以覆盖这些映射。

config.active_record.protocol_adapters.mysql = "trilogy"

如果未找到映射,则协议将用作适配器名称。

3.8.77. config.active_record.deprecated_associations_options

如果存在,这必须是一个带有键 :mode 和/或 :backtrace 的哈希。

config.active_record.deprecated_associations_options = { mode: :notify, backtrace: true }
  • :warn 模式下,Active Record 日志记录器会报告对已弃用关联的访问。这是默认模式。

  • :raise 模式下,使用会引发 ActiveRecord::DeprecatedAssociationError,并附带类似的消息和异常对象中清晰的堆栈跟踪。

  • :notify 模式下,会发布 deprecated_association.active_record Active Support 通知。请参阅 Active Support Instrumentation guide 中有关其有效负载的详细信息。

默认情况下,回溯是禁用的。如果 :backtrace 为 true,则警告消息中包含清晰的回溯,通知在有效负载中包含 :backtrace 键,其值为干净的 Thread::Backtrace::Location 对象数组。异常始终具有干净的堆栈跟踪。

干净的回溯是使用 Active Record 回溯清理器计算的。

3.8.78. config.active_record.raise_on_missing_required_finder_order_columns

当调用依赖于顺序的查找器方法(例如 #first#second)时,如果在关系上没有 order 值,并且模型没有可回退的任何排序列(implicit_order_columnquery_constraintsprimary_key),则会引发错误。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) false
8.1 true

3.9. 配置 Action Controller

config.action_controller 包含许多配置设置

3.9.1. config.action_controller.asset_host

设置资产的主机。当使用 CDN 托管资产而不是应用程序服务器本身时很有用。只有当您对 Action Mailer 有不同的配置时才应使用此选项,否则请使用 config.asset_host

3.9.2. config.action_controller.perform_caching

配置应用程序是否应执行 Action Controller 组件提供的缓存功能。在开发环境中设置为 false,在生产环境中设置为 true。如果未指定,默认值为 true

3.9.3. config.action_controller.default_static_extension

配置用于缓存页面的扩展名。默认为 .html

3.9.4. config.action_controller.include_all_helpers

配置是否所有视图助手都在任何地方可用,或者是否限定在相应的控制器。如果设置为 false,则 UsersHelper 方法仅对作为 UsersController 一部分渲染的视图可用。如果为 true,则 UsersHelper 方法在任何地方都可用。默认配置行为(当此选项未明确设置为 truefalse 时)是所有视图助手都可用于每个控制器。

3.9.5. config.action_controller.logger

接受符合 Log4r 接口或默认 Ruby Logger 类的日志记录器,然后将其用于记录来自 Action Controller 的信息。设置为 nil 可禁用日志记录。

3.9.6. config.action_controller.request_forgery_protection_token

设置 RequestForgery 的令牌参数名称。默认情况下,调用 protect_from_forgery 会将其设置为 :authenticity_token

3.9.7. config.action_controller.allow_forgery_protection

启用或禁用 CSRF 保护。默认情况下,在测试环境中为 false,在所有其他环境中为 true

3.9.8. config.action_controller.forgery_protection_origin_check

配置是否应将 HTTP Origin 标头与网站的来源进行检查,作为额外的 CSRF 防御。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) false
5.0 true

3.9.9. config.action_controller.per_form_csrf_tokens

配置 CSRF 令牌是否仅对生成它们的 method/action 有效。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) false
5.0 true

3.9.10. config.action_controller.default_protect_from_forgery

确定是否在 ActionController::Base 上添加伪造保护。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) false
5.2 true

3.9.11. config.action_controller.relative_url_root

可用于告诉 Rails 您正在部署到子目录。默认值为 config.relative_url_root

3.9.12. config.action_controller.permit_all_parameters

设置所有用于批量赋值的参数默认允许。默认值为 false

3.9.13. config.action_controller.action_on_unpermitted_parameters

控制发现未明确允许的参数时的行为。默认值在测试和开发环境中为 :log,否则为 false。值可以是:

  • false 不采取任何行动
  • :logunpermitted_parameters.action_controller 主题上发出 ActiveSupport::Notifications.instrument 事件,并以 DEBUG 级别记录
  • :raise 抛出 ActionController::UnpermittedParameters 异常

3.9.14. config.action_controller.always_permitted_parameters

设置默认允许的参数列表。默认值为 ['controller', 'action']

3.9.15. 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.9.16. config.action_controller.raise_on_missing_callback_actions

当回调的 :only:except 选项中指定的操作在控制器中缺失时,会引发 AbstractController::ActionNotFound 异常。

从版本开始 默认值为
(原始) false
7.1 true(开发和测试),false(其他环境)

3.9.17. config.action_controller.raise_on_open_redirects

通过使外部重定向选择性加入,保护应用程序免受无意中重定向到外部主机(也称为“开放重定向”)的影响。

当此配置设置为 true 时,如果将带有外部主机的 URL 传递给 redirect_to,将引发 ActionController::Redirecting::UnsafeRedirectError。如果允许开放重定向,则可以在对 redirect_to 的调用中添加 allow_other_host: true

从版本开始 默认值为
(原始) false

3.9.18. config.action_controller.action_on_open_redirect

控制 Rails 如何处理开放重定向尝试(重定向到外部主机)。

注意:此配置取代了已弃用的 config.action_controller.raise_on_open_redirects 选项,该选项将在未来的 Rails 版本中移除。新配置提供了更灵活的开放重定向保护控制。

当设置为 :log 时,Rails 将在检测到开放重定向时记录警告。当设置为 :notify 时,Rails 将发布 open_redirect.action_controller 通知事件。当设置为 :raise 时,Rails 将引发 ActionController::Redirecting::UnsafeRedirectError

如果 raise_on_open_redirects 设置为 true,为了向后兼容性,它将优先于此配置,有效地强制 :raise 行为。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) :log
7.0 :raise

3.9.19. config.action_controller.action_on_path_relative_redirect

控制 Rails 如何处理路径相对 URL 重定向。

当设置为 :log(默认)时,Rails 将在检测到路径相对 URL 重定向时记录警告。当设置为 :notify 时,Rails 将发布 unsafe_redirect.action_controller 通知事件。当设置为 :raise 时,Rails 将引发 ActionController::Redirecting::UnsafeRedirectError

这有助于检测可能不安全的重定向,这些重定向可能被利用进行开放重定向攻击。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) :log
8.1 :raise

3.9.20. config.action_controller.log_query_tags_around_actions

确定查询标签的控制器上下文是否将通过 around_filter 自动更新。默认值为 true

3.9.21. config.action_controller.wrap_parameters_by_default

在 Rails 7.0 之前,新应用程序生成了一个名为 wrap_parameters.rb 的初始化器,该初始化器在 ActionController::Base 中为 JSON 请求启用了参数包装。

将此配置值设置为 true 具有与初始化器相同的行为,允许应用程序在不希望自定义参数包装行为时删除初始化器。

无论此值如何,应用程序都可以像以前一样在初始化器或每个控制器中继续自定义参数包装行为。

有关参数包装的更多信息,请参阅 ParamsWrapper

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) false
7.0 true

3.9.22. config.action_controller.allowed_redirect_hosts

指定重定向的允许主机列表。redirect_to 将允许重定向到它们而不会引发 UnsafeRedirectError 错误。

3.9.23. ActionController::Base.wrap_parameters

配置 ParamsWrapper。这可以在顶层或单个控制器上调用。

3.9.24. config.action_controller.escape_json_responses

配置 JSON 渲染器以转义 HTML 实体和 JavaScript 中无效的 Unicode 字符。

如果您依赖 JSON 响应转义这些字符以将 JSON 文档嵌入 HTML 中的 <script> 标签,这很有用。

这主要用于升级 Rails 应用程序时的兼容性,否则您可以在特定的控制器操作中使用 render json::escape 选项。

从版本开始 默认值为
(原始) true
8.1 false

3.10. 配置 Action Dispatch

3.10.1. config.action_dispatch.cookies_serializer

指定用于 cookie 的序列化器。接受与 config.active_support.message_serializer 相同的值,此外还有 :hybrid,它是 :json_allow_marshal 的别名。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) :marshal
7.0 :json

3.10.2. config.action_dispatch.debug_exception_log_level

配置 ActionDispatch::DebugExceptions 中间件在请求期间记录未捕获异常时使用的日志级别。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) :fatal
7.1 :error

3.10.3. config.action_dispatch.default_headers

是一个哈希,其中包含每个响应中默认设置的 HTTP 标头。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始)
{
"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"
}
7.0
{
"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"
}
7.1
{
"X-Frame-Options" => "SAMEORIGIN",
"X-XSS-Protection" => "0",
"X-Content-Type-Options" => "nosniff",
"X-Permitted-Cross-Domain-Policies" => "none",
"Referrer-Policy" => "strict-origin-when-cross-origin"
}

3.10.4. config.action_dispatch.default_charset

指定所有渲染的默认字符集。默认为 nil

3.10.5. config.action_dispatch.tld_length

设置应用程序的 TLD(顶级域)长度。默认为 1

3.10.6. config.action_dispatch.domain_extractor

配置 Action Dispatch 用于将主机名解析为域和子域组件的域提取策略。这必须是一个响应 domain_from(host, tld_length)subdomains_from(host, tld_length) 方法的对象。

默认为 ActionDispatch::Http::URL::DomainExtractor,它提供了标准的域解析逻辑。您可以提供自定义提取器来实现专门的域解析行为。

class CustomDomainExtractor
  def self.domain_from(host, tld_length)
    # Custom domain extraction logic
  end

  def self.subdomains_from(host, tld_length)
    # Custom subdomain extraction logic
  end
end

config.action_dispatch.domain_extractor = CustomDomainExtractor

3.10.7. config.action_dispatch.ignore_accept_header

用于确定是否忽略来自请求的 accept 标头。默认为 false

3.10.8. config.action_dispatch.x_sendfile_header

指定服务器特定的 X-Sendfile 标头。这对于从服务器加速文件发送很有用。例如,对于 Apache,它可以设置为“X-Sendfile”。

3.10.9. config.action_dispatch.http_auth_salt

设置 HTTP Auth 盐值。默认为 'http authentication'

设置签名 cookie 的盐值。默认为 'signed cookie'

设置加密 cookie 的盐值。默认为 'encrypted cookie'

设置签名加密 cookie 的盐值。默认为 'signed encrypted cookie'

设置认证加密 cookie 盐。默认为 'authenticated encrypted cookie'

设置用于加密 cookie 的密码。默认为 "aes-256-gcm"

设置用于签名 cookie 的摘要。默认为 "SHA1"

3.10.16. config.action_dispatch.cookies_rotations

允许轮换加密和签名 cookie 的密钥、密码和摘要。

控制签名和加密 cookie 是否使用 AES-256-GCM 密码或较旧的 AES-256-CBC 密码。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) false
5.2 true

3.10.18. config.action_dispatch.use_cookies_with_metadata

启用写入带有嵌入用途元数据的 cookie。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) false
6.0 true

3.10.19. config.action_dispatch.perform_deep_munge

配置是否对参数执行 deep_munge 方法。有关更多信息,请参阅 安全指南。它默认为 true

3.10.20. config.action_dispatch.rescue_responses

配置哪些异常分配给 HTTP 状态。它接受一个哈希,您可以指定异常/状态对。

# It's good to use #[]= or #merge! to respect the default values
config.action_dispatch.rescue_responses["MyAuthenticationError"] = :unauthorized

使用 ActionDispatch::ExceptionWrapper.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,
  "ActionDispatch::Http::MimeNegotiation::InvalidType" => :not_acceptable,
  "ActionController::MissingExactTemplate" => :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 Internal Server Error。

3.10.21. config.action_dispatch.cookies_same_site_protection

配置设置 cookie 时 SameSite 属性的默认值。当设置为 nil 时,不添加 SameSite 属性。为了允许根据请求动态配置 SameSite 属性的值,可以指定一个 proc。例如:

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

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) nil
6.1 :lax

3.10.22. config.action_dispatch.ssl_default_redirect_status

配置在 ActionDispatch::SSL 中间件中将非 GET/HEAD 请求从 HTTP 重定向到 HTTPS 时使用的默认 HTTP 状态码。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) 307
6.1 308

3.10.23. config.action_dispatch.log_rescued_responses

启用记录 rescue_responses 中配置的那些未处理的异常。默认为 true

3.10.24. config.action_dispatch.show_exceptions

config.action_dispatch.show_exceptions 配置控制 Action Pack(特别是 ActionDispatch::ShowExceptions 中间件)如何处理响应请求时引发的异常。

将值设置为 :all 会配置 Action Pack 捕获所有异常并渲染相应的错误页面。例如,Action Pack 会捕获 ActiveRecord::RecordNotFound 异常并以 404 Not found 状态码渲染 public/404.html 的内容。

将值设置为 :rescuable 会配置 Action Pack 捕获 config.action_dispatch.rescue_responses 中定义的异常,并抛出所有其他异常。例如,Action Pack 会捕获 ActiveRecord::RecordNotFound,但会抛出 NoMethodError

将值设置为 :none 会配置 Action Pack 抛出所有异常。

从版本开始 默认值为
(原始) true
7.1 :all

3.10.25. config.action_dispatch.strict_freshness

配置当响应中同时存在 ETag 标头和 Last-Modified 标头时,ActionDispatch::ETag 中间件是否应优先使用 ETag 标头。

如果设置为 true,当两个标头都存在时,根据 RFC 7232 第 6 节的规定,仅考虑 ETag

如果设置为 false,当两个标头都存在时,将检查这两个标头,并且两个都必须匹配才能将响应视为新鲜。

从版本开始 默认值为
(原始) false
8.0 true

如果 cookie 被标记为不安全,或者请求通过 SSL 发出,或者请求发送到 onion 服务,则会在请求结束时写入 cookie。

如果设置为 true,即使不满足这些条件,也会写入 cookie。

development 环境中默认为 true,在所有其他环境中为 false

3.10.27. config.action_dispatch.verbose_redirect_logs

指定是否应在相关日志行下方记录重定向的源位置。默认情况下,在开发环境中该标志为 true,在所有其他环境中为 false

3.10.28. ActionDispatch::Callbacks.before

接受一段代码块,在请求之前运行。

3.10.29. ActionDispatch::Callbacks.after

接受一段代码块,在请求之后运行。

3.11. 配置 Action View

config.action_view 包含少量配置设置

3.11.1. config.action_view.cache_template_loading

控制模板是否应在每个请求时重新加载。默认为 !config.enable_reloading

3.11.2. config.action_view.field_error_proc

提供一个 HTML 生成器,用于显示来自 Active Model 的错误。该块在 Action View 模板的上下文中进行评估。默认值为:

Proc.new { |html_tag, instance| content_tag :div, html_tag, class: "field_with_errors" }

3.11.3. config.action_view.default_form_builder

告诉 Rails 默认使用哪个表单构建器。默认值为 ActionView::Helpers::FormBuilder。如果您希望您的表单构建器类在初始化后加载(以便在开发环境中每次请求时重新加载),您可以将其作为 String 传递。

3.11.4. config.action_view.logger

接受符合 Log4r 接口或默认 Ruby Logger 类的日志记录器,然后将其用于记录来自 Action View 的信息。设置为 nil 可禁用日志记录。

3.11.5. config.action_view.erb_trim_mode

控制某些 ERB 语法是否应修剪。默认为 '-',这意味着在使用 <%= -%><%= =%> 时,将修剪尾部空格和换行符。将其设置为任何其他值将关闭修剪支持。

3.11.6. config.action_view.frozen_string_literal

使用 # frozen_string_literal: true 魔法注释编译 ERB 模板,使所有字符串文字冻结并节省分配。设置为 true 以对所有视图启用它。

3.11.7. config.action_view.embed_authenticity_token_in_remote_forms

允许您为带有 remote: true 的表单设置 authenticity_token 的默认行为。默认设置为 false,这意味着远程表单将不包含 authenticity_token,这在对表单进行片段缓存时很有用。远程表单从 meta 标签获取真实性,因此除非您支持没有 JavaScript 的浏览器,否则嵌入是不必要的。在这种情况下,您可以将 authenticity_token: true 作为表单选项传递,或将此配置设置设置为 true

3.11.8. config.action_view.prefix_partial_path_with_controller_namespace

确定是否从命名空间控制器的模板中查找子目录中的部分。例如,考虑一个名为 Admin::ArticlesController 的控制器,它渲染此模板:

<%= render @article %>

默认设置为 true,它使用 /admin/articles/_article.erb 处的部分。将值设置为 false 将渲染 /articles/_article.erb,这与从非命名空间控制器(如 ArticlesController)渲染的行为相同。

3.11.9. config.action_view.automatically_disable_submit_tag

确定 submit_tag 是否应在点击时自动禁用,默认为 true

3.11.10. config.action_view.debug_missing_translation

确定是否将缺失的翻译键包装在 <span> 标签中。默认为 true

3.11.11. config.action_view.form_with_generates_remote_forms

确定 form_with 是否生成远程表单。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
5.1 true
6.1 false

3.11.12. config.action_view.form_with_generates_ids

确定 form_with 是否在输入上生成 ID。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) false
5.2 true

3.11.13. config.action_view.default_enforce_utf8

确定是否使用隐藏标签生成表单,该标签强制旧版本的 Internet Explorer 以 UTF-8 编码提交表单。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) true
6.0 false

3.11.14. config.action_view.image_loading

指定 image_tag 助手渲染的 <img> 标签的 loading 属性的默认值。例如,当设置为 "lazy" 时,image_tag 渲染的 <img> 标签将包含 loading="lazy",这会指示浏览器等到图像靠近视口时才加载它。(此值仍然可以通过将例如 loading: "eager" 传递给 image_tag 来为每个图像覆盖。)默认为 nil

3.11.15. config.action_view.image_decoding

指定 image_tag 助手渲染的 <img> 标签的 decoding 属性的默认值。默认为 nil

3.11.16. config.action_view.annotate_rendered_view_with_filenames

确定是否使用模板文件名注释渲染的视图。默认为 false

确定 javascript_include_tagstylesheet_link_tag 是否会生成预加载资产的 link 标头。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) nil
6.1 true

3.11.18. config.action_view.button_to_generates_button_tag

false 时,button_to 将根据内容传递方式(为简洁省略 <form>)在 <form> 内渲染 <button><input>

<%= button_to "Content", "/" %>
# => <input type="submit" value="Content">

<%= button_to "/" do %>
  Content
<% end %>
# => <button type="submit">Content</button>

将此值设置为 true 会使 button_to 在两种情况下都在 <form> 标签内生成 <button> 标签。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) false
7.0 true

3.11.19. config.action_view.apply_stylesheet_media_default

确定当未提供 media 属性时,stylesheet_link_tag 是否将 screen 作为 media 属性的默认值渲染。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) true
7.0 false

3.11.20. config.action_view.prepend_content_exfiltration_prevention

确定 form_tagbutton_to 助手是否生成以浏览器安全(但技术上无效)HTML 开头的 HTML 标签,以确保其内容不会被任何前面的未封闭标签捕获。默认值为 false

3.11.21. config.action_view.sanitizer_vendor

通过设置 ActionView::Helpers::SanitizeHelper.sanitizer_vendor 来配置 Action View 使用的 HTML 净化器集合。默认值取决于 config.load_defaults 目标版本。

从版本开始 默认值为 解析标记为
(原始) Rails::HTML4::Sanitizer HTML4
7.1 Rails::HTML5::Sanitizer (见 NOTE) HTML5

Rails::HTML5::Sanitizer 在 JRuby 上不受支持,因此在 JRuby 平台上,Rails 将回退到 Rails::HTML4::Sanitizer

3.11.22. config.action_view.remove_hidden_field_autocomplete

启用后,由 form_tagtoken_tagmethod_tag 生成的隐藏输入,以及 button_to 表单中包含的隐藏参数字段将省略 autocomplete="off" 属性。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) false
8.1 true

3.11.23. config.action_view.render_tracker

配置跟踪 Action View 模板之间依赖关系的策略。

从版本开始 默认值为
(原始) :regex
8.1 :ruby

3.12. 配置 Action Mailbox

config.action_mailbox 提供以下配置选项

3.12.1. config.action_mailbox.logger

包含 Action Mailbox 使用的日志记录器。它接受符合 Log4r 接口或默认 Ruby Logger 类的日志记录器。默认值为 Rails.logger

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

3.12.2. config.action_mailbox.incinerate_after

接受一个 ActiveSupport::Duration,指示在处理 ActionMailbox::InboundEmail 记录后应销毁多长时间。默认为 30.days

# Incinerate inbound emails 14 days after processing.
config.action_mailbox.incinerate_after = 14.days

3.12.3. config.action_mailbox.queues.incineration

接受一个符号,指示用于焚烧作业的 Active Job 队列。当此选项为 nil 时,焚烧作业将发送到默认的 Active Job 队列(参见 config.active_job.default_queue_name)。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) :action_mailbox_incineration
6.1 nil

3.12.4. config.action_mailbox.queues.routing

接受一个符号,指示用于路由作业的 Active Job 队列。当此选项为 nil 时,路由作业将发送到默认的 Active Job 队列(参见 config.active_job.default_queue_name)。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) :action_mailbox_routing
6.1 nil

3.12.5. config.action_mailbox.storage_service

接受一个符号,指示用于上传电子邮件的 Active Storage 服务。当此选项为 nil 时,电子邮件将上传到默认的 Active Storage 服务(参见 config.active_storage.service)。

3.13. 配置 Action Mailer

config.action_mailer 有许多可用设置。

3.13.1. config.action_mailer.asset_host

设置资产的主机。当使用 CDN 托管资产而不是应用程序服务器本身时很有用。只有当您对 Action Controller 有不同的配置时才应使用此选项,否则请使用 config.asset_host

3.13.2. config.action_mailer.logger

接受符合 Log4r 接口或默认 Ruby Logger 类的日志记录器,然后将其用于记录来自 Action Mailer 的信息。设置为 nil 可禁用日志记录。

3.13.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_NONEOpenSSL::SSL::VERIFY_PEER
  • :ssl/:tls - 启用 SMTP 连接使用 SMTP/TLS(SMTPS:通过直接 TLS 连接的 SMTP)。
  • :open_timeout - 尝试打开连接时等待的秒数。
  • :read_timeout - 读取(2) 调用超时前等待的秒数。

此外,还可以传递 Mail::SMTP 支持的任何 配置选项

3.13.4. config.action_mailer.smtp_timeout

在版本 2.8.0 之前,mail gem 未为其 SMTP 请求配置任何默认超时。此配置使应用程序能够配置 mail gem 中 :open_timeout:read_timeout 的默认值,以便请求不会无限期地卡住。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) nil
7.0 5

3.13.5. config.action_mailer.sendmail_settings

允许对 :sendmail 传递方法进行详细配置。它接受一个选项哈希,其中可以包含以下任何选项:

  • :location - sendmail 可执行文件的位置。默认为 /usr/sbin/sendmail
  • :arguments - 命令行参数。默认为 %w[ -i ]

3.13.6. config.action_mailer.file_settings

配置 :file 传递方法。它接受一个选项哈希,其中可以包含:

  • :location - 文件保存的位置。默认为 "#{Rails.root}/tmp/mails"
  • :extension - 文件扩展名。默认为空字符串。

3.13.7. config.action_mailer.raise_delivery_errors

指定如果电子邮件递送无法完成是否抛出错误。默认为 true

3.13.8. config.action_mailer.delivery_method

定义递送方法,默认为 :smtp。有关更多信息,请参阅 Action Mailer 指南中的配置部分

3.13.9. config.action_mailer.perform_deliveries

指定是否实际递送邮件,默认值为 true。为了测试方便,可以将其设置为 false

3.13.10. 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"]
}

分配一个哈希以设置其他选项

config.action_mailer.default_options = {
  from: "noreply@example.com"
}

3.13.11. config.action_mailer.observers

注册观察者,当邮件递送时将收到通知。

config.action_mailer.observers = ["MailObserver"]

3.13.12. config.action_mailer.interceptors

注册拦截器,这些拦截器将在发送邮件之前被调用。

config.action_mailer.interceptors = ["MailInterceptor"]

3.13.13. config.action_mailer.preview_interceptors

注册拦截器,这些拦截器将在预览邮件之前被调用。

config.action_mailer.preview_interceptors = ["MyPreviewMailInterceptor"]

3.13.14. config.action_mailer.preview_paths

指定邮件预览的位置。将路径附加到此配置选项将导致在搜索邮件预览时使用这些路径。

config.action_mailer.preview_paths << "#{Rails.root}/lib/mailer_previews"

3.13.15. config.action_mailer.show_previews

启用或禁用邮件预览。默认情况下,在开发环境中此值为 true

config.action_mailer.show_previews = false

3.13.16. config.action_mailer.perform_caching

指定邮件程序模板是否应执行片段缓存。如果未指定,默认值为 true

3.13.17. config.action_mailer.deliver_later_queue_name

指定用于默认递送作业的 Active Job 队列(参见 config.action_mailer.delivery_job)。当此选项设置为 nil 时,递送作业将发送到默认的 Active Job 队列(参见 config.active_job.default_queue_name)。

邮件程序类可以覆盖此选项以使用不同的队列。请注意,这仅适用于使用默认递送作业的情况。如果您的邮件程序正在使用自定义作业,则将使用其队列。

确保您的 Active Job 适配器也配置为处理指定的队列,否则递送作业可能会被静默忽略。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) :mailers
6.1 nil

3.13.18. config.action_mailer.delivery_job

指定邮件的递送作业。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) ActionMailer::MailDeliveryJob
6.0 "ActionMailer::MailDeliveryJob"

3.14. 配置 Active Support

Active Support 中有一些配置选项可用

3.14.1. config.active_support.bare

启用或禁用 Rails 启动时加载 active_support/all。默认为 nil,这意味着加载 active_support/all

3.14.2. config.active_support.test_order

设置测试用例的执行顺序。可能的值为 :random:sorted。默认为 :random

3.14.3. config.active_support.escape_html_entities_in_json

启用或禁用 JSON 序列化中 HTML 实体的转义。默认为 true

3.14.4. config.active_support.use_standard_json_time_format

启用或禁用将日期序列化为 ISO 8601 格式。默认为 true

3.14.5. config.active_support.time_precision

设置 JSON 编码时间值的精度。默认为 3

3.14.6. config.active_support.hash_digest_class

允许配置用于生成非敏感摘要(如 ETag 标头)的摘要类。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) OpenSSL::Digest::MD5
5.2 OpenSSL::Digest::SHA1
7.0 OpenSSL::Digest::SHA256

3.14.7. config.active_support.key_generator_hash_digest_class

允许配置用于从配置的密钥库派生秘密(例如加密 cookie)的摘要类。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) OpenSSL::Digest::SHA1
7.0 OpenSSL::Digest::SHA256

3.14.8. config.active_support.use_authenticated_message_encryption

指定是否使用 AES-256-GCM 认证加密作为默认密码来加密消息,而不是 AES-256-CBC。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) false
5.2 true

3.14.9. config.active_support.message_serializer

指定 ActiveSupport::MessageEncryptorActiveSupport::MessageVerifier 实例使用的默认序列化器。为了方便序列化器之间的迁移,提供的序列化器包含一个回退机制以支持多种反序列化格式。

序列化器 序列化和反序列化 回退反序列化
:marshal Marshal ActiveSupport::JSON, ActiveSupport::MessagePack
:json ActiveSupport::JSON ActiveSupport::MessagePack
:json_allow_marshal ActiveSupport::JSON ActiveSupport::MessagePack, Marshal
:message_pack ActiveSupport::MessagePack ActiveSupport::JSON
:message_pack_allow_marshal ActiveSupport::MessagePack ActiveSupport::JSON, Marshal

在消息签名密钥泄露的情况下,Marshal 是反序列化攻击的潜在载体。如果可能,请选择不支持 Marshal 的序列化器。

:message_pack:message_pack_allow_marshal 序列化器支持往返一些 JSON 不支持的 Ruby 类型,例如 Symbol。它们还可以提供改进的性能和更小的有效载荷大小。但是,它们需要 msgpack gem

当回退到备用反序列化格式时,上述每个序列化器都将发出 message_serializer_fallback.active_support 事件通知,允许您跟踪此类回退发生的频率。

或者,您可以指定任何响应 dumpload 方法的序列化器对象。例如:

config.active_support.message_serializer = YAML

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) :marshal
7.1 :json_allow_marshal

3.14.10. config.active_support.use_message_serializer_for_metadata

当为 true 时,启用一项性能优化,可将消息数据和元数据一起序列化。这会改变消息格式,因此以这种方式序列化的消息无法被旧版本(< 7.1)的 Rails 读取。但是,使用旧格式的消息仍然可以读取,无论是否启用此优化。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) false
7.1 true

3.14.11. config.active_support.cache_format_version

指定用于缓存的序列化格式。可能的值为 7.07.1

7.0 更有效地序列化缓存条目。

7.1 进一步提高了效率,并允许在不反序列化其值的情况下检测过期和版本不匹配的缓存条目。它还包括对裸字符串值(例如视图片段)的优化。

所有格式都向后和向前兼容,这意味着使用一种格式写入的缓存条目可以在使用另一种格式时读取。此行为使得在不使整个缓存失效的情况下在格式之间进行迁移变得容易。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
7.0 7.0
7.1 7.1

3.14.12. config.active_support.deprecation

配置弃用警告的行为。有关可用选项的描述,请参阅 Deprecation::Behavior

在默认生成的 config/environments 文件中,此设置为开发环境的 :log 和测试环境的 :stderr,并且在生产环境中省略,而使用 config.active_support.report_deprecations

3.14.13. config.active_support.disallowed_deprecation

配置禁止弃用警告的行为。有关可用选项的描述,请参阅 Deprecation::Behavior

此选项适用于开发和测试。对于生产环境,请优先使用 config.active_support.report_deprecations

3.14.14. config.active_support.disallowed_deprecation_warnings

配置应用程序认为不允许的弃用警告。这允许例如将特定弃用视为硬性失败。

3.14.15. config.active_support.report_deprecations

当为 false 时,禁用所有弃用警告,包括来自应用程序的弃用器的禁止弃用。这包括来自 Rails 和其他可能将其弃用器添加到弃用器集合的 gem 的所有弃用,但可能无法阻止从 ActiveSupport::Deprecation 发出的所有弃用警告。

在默认生成的 config/environments 文件中,此在生产环境中设置为 false

3.14.16. config.active_support.isolation_level

配置 Rails 内部大部分状态的局部性。如果您使用基于纤程的服务器或作业处理器(例如 falcon),您应该将其设置为 :fiber。否则,最好使用 :thread 局部性。默认为 :thread

3.14.17. config.active_support.executor_around_test_case

配置测试套件以在测试用例周围调用 Rails.application.executor.wrap。这使得测试用例的行为更接近实际请求或作业。通常在测试中禁用的几个功能,例如 Active Record 查询缓存和异步查询,将因此启用。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) false
7.0 true

3.14.18. ActiveSupport::Logger.silencer

设置为 false 可禁用在代码块中静默日志记录的功能。默认值为 true

3.14.19. ActiveSupport::Cache::Store.logger

指定缓存存储操作中使用的日志记录器。

3.14.20. ActiveSupport.utc_to_local_returns_utc_offset_times

配置 ActiveSupport::TimeZone.utc_to_local 返回带有 UTC 偏移的时间,而不是包含该偏移的 UTC 时间。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) false
6.1 true

3.14.21. config.active_support.raise_on_invalid_cache_expiration_time

指定当 Rails.cache fetchwrite 获得无效的 expires_atexpires_in 时间时,是否应引发 ArgumentError

选项为 truefalse。如果为 false,异常将报告为 handled 并记录。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) false
7.1 true

3.14.22. config.active_support.event_reporter_context_store

为事件报告器配置自定义上下文存储。上下文存储用于管理应附加到报告器发出的每个事件的元数据。

默认情况下,事件报告器使用 ActiveSupport::EventContext,它将上下文存储在纤程本地存储中。

要使用自定义上下文存储,请将此配置设置为实现上下文存储接口的类:

# config/application.rb
config.active_support.event_reporter_context_store = CustomContextStore

class CustomContextStore
  class << self
    def context
      # Return the context hash
    end

    def set_context(context_hash)
      # Append context_hash to the existing context store
    end

    def clear
      # Clear the stored context
    end
  end
end

默认为 nil,这意味着使用默认的 ActiveSupport::EventContext 存储。

3.14.23. config.active_support.escape_js_separators_in_json

指定生成 JSON 时是否转义 LINE SEPARATOR (U+2028) 和 PARAGRAPH SEPARATOR (U+2029)。

历史上,这些字符在 JavaScript 字面字符串中是无效的,但 ECMAScript 2019 改变了这一点。因此,在现代浏览器中不再是一个问题:https://caniuse.cn/mdn-javascript_builtins_json_json_superset

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) true
8.1 false

3.15. 配置 Active Job

config.active_job 提供以下配置选项

3.15.1. config.active_job.queue_adapter

设置排队后端的适配器。默认适配器为 :async。有关内置适配器的最新列表,请参阅 ActiveJob::QueueAdapters API 文档

# Be sure to have the adapter's gem in your Gemfile
# and follow the adapter's specific installation
# and deployment instructions.
config.active_job.queue_adapter = :sidekiq

3.15.2. config.active_job.default_queue_name

可用于更改默认队列名称。默认情况下为 "default"

config.active_job.default_queue_name = :medium_priority

3.15.3. config.active_job.queue_name_prefix

允许您为所有作业设置一个可选的、非空的队列名称前缀。默认情况下它是空的并且不使用。

以下配置将在生产环境中将给定作业排队到 production_high_priority 队列:

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

3.15.4. config.active_job.queue_name_delimiter

默认值为 '_'。如果设置了 queue_name_prefix,则 queue_name_delimiter 连接前缀和未加前缀的队列名称。

以下配置将把提供的作业排队到 video_server.low_priority 队列:

# prefix must be set for delimiter to be used
config.active_job.queue_name_prefix = "video_server"
config.active_job.queue_name_delimiter = "."
class EncoderJob < ActiveJob::Base
  queue_as :low_priority
  #....
end

3.15.5. config.active_job.logger

接受符合 Log4r 接口或默认 Ruby Logger 类的日志记录器,然后将其用于记录来自 Active Job 的信息。您可以通过在 Active Job 类或 Active Job 实例上调用 logger 来检索此日志记录器。设置为 nil 可禁用日志记录。

3.15.6. config.active_job.custom_serializers

允许设置自定义参数序列化器。默认为 []

3.15.7. config.active_job.log_arguments

控制是否记录作业的参数。默认为 true

3.15.8. config.active_job.verbose_enqueue_logs

指定是否应在相关入队日志行下方记录将后台作业入队的方法的源位置。默认情况下,在开发环境中该标志为 true,在所有其他环境中为 false

3.15.9. config.active_job.retry_jitter

控制应用于重试失败作业时计算出的延迟时间的“抖动”(随机变化)量。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) 0.0
6.1 0.15

3.15.10. config.active_job.log_query_tags_around_perform

确定查询标签的作业上下文是否将通过 around_perform 自动更新。默认值为 true

3.16. 配置 Action Cable

3.16.1. config.action_cable.url

接受一个字符串,用于您托管 Action Cable 服务器的 URL。如果您运行的 Action Cable 服务器与您的主应用程序分离,您将使用此选项。

3.16.2. config.action_cable.mount_path

接受一个字符串,用于在主服务器进程中挂载 Action Cable 的位置。默认为 /cable。您可以将其设置为 nil,以不在正常的 Rails 服务器中挂载 Action Cable。

您可以在 Action Cable 概述 中找到更详细的配置选项。

3.16.3. config.action_cable.precompile_assets

确定是否应将 Action Cable 资产添加到资产管道预编译中。如果未使用 Sprockets,则无效。默认值为 true

3.16.4. config.action_cable.allow_same_origin_as_host

确定是否允许与 cable 服务器本身匹配的来源。默认值为 true

设置为 false 可禁用同源请求的自动访问,并严格只允许配置的来源。

3.16.5. config.action_cable.allowed_request_origins

决定电缆服务器将接受的请求源。在 development 环境中,默认值为 /https?:\/\/:\d+/

3.17. 配置 Active Storage

config.active_storage 提供以下配置选项:

3.17.1. config.active_storage.variant_processor

接受符号 :mini_magick:vips:disabled,指定是否使用 MiniMagick 或 ruby-vips 执行变体转换和 blob 分析。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) :mini_magick
7.0 :vips

3.17.2. config.active_storage.analyzers

接受一个类数组,指示 Active Storage blob 可用的分析器。默认情况下,这定义为:

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

图像分析器可以提取图像 blob 的宽度和高度;视频分析器可以提取视频 blob 的宽度、高度、持续时间、角度、纵横比以及视频/音频通道的存在/缺失;音频分析器可以提取音频 blob 的持续时间和比特率。

如果要禁用分析器,可以将其设置为空数组:

config.active_storage.analyzers = []

3.17.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.17.4. config.active_storage.paths

接受一个选项哈希,指示预览器/分析器命令的位置。默认值为 {},表示将在默认路径中查找命令。可以包含以下任何选项:

  • :ffprobe - ffprobe 可执行文件的位置。
  • :mutool - mutool 可执行文件的位置。
  • :ffmpeg - ffmpeg 可执行文件的位置。
config.active_storage.paths[:ffprobe] = "/usr/local/bin/ffprobe"

3.17.5. config.active_storage.variable_content_types

接受一个字符串数组,指示 Active Storage 可以通过变体处理器进行转换的内容类型。默认情况下,这定义为:

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

3.17.6. config.active_storage.web_image_content_types

接受一个字符串数组,这些字符串被视为 Web 图像内容类型,其中可以在不转换为回退 PNG 格式的情况下处理变体。例如,如果要在应用程序中使用 AVIF 变体,可以将 image/avif 添加到此数组中。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) %w(image/png image/jpeg image/gif)
7.2 %w(image/png image/jpeg image/gif image/webp)

3.17.7. config.active_storage.content_types_to_serve_as_binary

接受一个字符串数组,指示 Active Storage 将始终作为附件而不是内联提供的内容类型。默认情况下,这定义为:

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.17.8. config.active_storage.content_types_allowed_inline

接受一个字符串数组,指示 Active Storage 允许作为内联提供的内容类型。默认情况下,这定义为:

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

3.17.9. config.active_storage.queues.analysis

接受一个符号,指示用于分析作业的 Active Job 队列。当此选项为 nil 时,分析作业将发送到默认的 Active Job 队列(请参阅 config.active_job.default_queue_name)。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
6.0 :active_storage_analysis
6.1 nil

3.17.10. config.active_storage.queues.mirror

接受一个符号,指示用于直接上传镜像作业的 Active Job 队列。当此选项为 nil 时,镜像作业将发送到默认的 Active Job 队列(请参阅 config.active_job.default_queue_name)。默认值为 nil

3.17.11. config.active_storage.queues.preview_image

接受一个符号,指示用于预处理图像预览的 Active Job 队列。当此选项为 nil 时,作业将发送到默认的 Active Job 队列(请参阅 config.active_job.default_queue_name)。默认值为 nil

3.17.12. config.active_storage.queues.purge

接受一个符号,指示用于清除作业的 Active Job 队列。当此选项为 nil 时,清除作业将发送到默认的 Active Job 队列(请参阅 config.active_job.default_queue_name)。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
6.0 :active_storage_purge
6.1 nil

3.17.13. config.active_storage.queues.transform

接受一个符号,指示用于预处理变体的 Active Job 队列。当此选项为 nil 时,作业将发送到默认的 Active Job 队列(请参阅 config.active_job.default_queue_name)。默认值为 nil

3.17.14. config.active_storage.logger

可用于设置 Active Storage 使用的日志记录器。接受符合 Log4r 或默认 Ruby Logger 类接口的日志记录器。

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

3.17.15. config.active_storage.service_urls_expire_in

确定由以下方法生成的 URL 的默认有效期:

默认值为 5 分钟。

3.17.16. config.active_storage.urls_expire_in

确定由 Active Storage 生成的 Rails 应用程序中 URL 的默认有效期。默认值为 nil。

3.17.17. config.active_storage.touch_attachment_records

指示 ActiveStorage::Attachments 在更新时触及其相应的记录。默认值为 true。

3.17.18. config.active_storage.routes_prefix

可用于设置 Active Storage 提供的路由的路由前缀。接受一个字符串,该字符串将添加到生成的路由前面。

config.active_storage.routes_prefix = "/files"

默认值为 /rails/active_storage

3.17.19. config.active_storage.track_variants

确定变体是否记录在数据库中。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) false
6.1 true

3.17.20. config.active_storage.draw_routes

可用于切换 Active Storage 路由生成。默认值为 true

3.17.21. config.active_storage.resolve_model_to_route

可用于全局更改 Active Storage 文件的交付方式。

允许的值为:

  • :rails_storage_redirect:重定向到签名、短生命周期的服务 URL。
  • :rails_storage_proxy:通过下载文件来代理文件。

默认值为 :rails_storage_redirect

3.17.22. config.active_storage.video_preview_arguments

可用于更改 ffmpeg 生成视频预览图像的方式。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) "-y -vframes 1 -f image2"
7.0 "-vf 'select=eq(n\\,0)+eq(key\\,1)+gt(scene\\,0.015)"1
+ ",loop=loop=-1:size=2,trim=start_frame=1'"2
+ " -frames:v 1 -f image2"

  1. 选择第一个视频帧、关键帧以及符合场景变化阈值的帧。
  2. 当没有其他帧符合标准时,通过循环第一个(一个或)两个选定帧,然后丢弃第一个循环帧,将第一个视频帧用作回退。

3.17.23. config.active_storage.multiple_file_field_include_hidden

在 Rails 7.1 及更高版本中,Active Storage has_many_attached 关系将默认替换当前集合而不是追加到它。因此,为了支持提交集合,当 multiple_file_field_include_hiddentrue 时,file_field 助手将渲染一个辅助隐藏字段,类似于 checkbox 助手渲染的辅助字段。

默认值取决于 config.load_defaults 目标版本

从版本开始 默认值为
(原始) false
7.0 true

3.17.24. config.active_storage.precompile_assets

确定 Active Storage 资产是否应添加到资产管道预编译中。如果未使用 Sprockets,则无效。默认值为 true

3.18. 配置 Action Text

3.18.1. config.action_text.attachment_tag_name

接受一个字符串,用于包装附件的 HTML 标签。默认为 "action-text-attachment"

3.18.2. config.action_text.sanitizer_vendor

通过将 ActionText::ContentHelper.sanitizer 设置为供应商的 .safe_list_sanitizer 方法返回的类的实例来配置 Action Text 使用的 HTML 清理器。默认值取决于 config.load_defaults 目标版本。

从版本开始 默认值为 解析标记为
(原始) Rails::HTML4::Sanitizer HTML4
7.1 Rails::HTML5::Sanitizer (见 NOTE) HTML5

Rails::HTML5::Sanitizer 在 JRuby 上不受支持,因此在 JRuby 平台上,Rails 将回退到 Rails::HTML4::Sanitizer

3.18.3. Regexp.timeout

请参阅 Ruby 关于 Regexp.timeout= 的文档。

3.19. 配置数据库

几乎每个 Rails 应用程序都将与数据库交互。您可以通过设置环境变量 ENV['DATABASE_URL'] 或使用名为 config/database.yml 的配置文件来连接数据库。

使用 config/database.yml 文件,您可以指定访问数据库所需的所有信息:

development:
  adapter: postgresql
  database: blog_development
  pool: 5

这将使用 postgresql 适配器连接到名为 blog_development 的数据库。相同的信息可以存储在 URL 中,并通过环境变量提供,如下所示:

ENV["DATABASE_URL"] # => "postgresql:///blog_development?pool=5"

config/database.yml 文件包含 Rails 默认可运行的三个不同环境的部分:

  • 当您手动与应用程序交互时,development 环境用于您的开发/本地计算机。
  • test 环境用于运行自动化测试。
  • production 环境用于您部署应用程序供世界使用时。

如果需要,您可以在 config/database.yml 中手动指定 URL:

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

config/database.yml 文件可以包含 ERB 标签 <%= %>。标签中的任何内容都将作为 Ruby 代码进行评估。您可以使用它从环境变量中提取数据或执行计算以生成所需的连接信息。

当使用 ENV['DATABASE_URL']config/database.yml 文件中的 url 键时,Rails 允许将 URL 中的协议映射到可以在应用程序内配置的数据库适配器。这允许在不修改部署环境中设置的 URL 的情况下配置适配器。请参阅:config.active_record.protocol_adapters

您无需手动更新数据库配置。如果您查看应用程序生成器的选项,您会看到其中一个选项名为 --database。此选项允许您从最常用的关系数据库列表中选择一个适配器。您甚至可以重复运行生成器:cd .. && rails new blog --database=mysql。当您确认覆盖 config/database.yml 文件时,您的应用程序将配置为使用 MySQL 而不是 SQLite。下面是常见数据库连接的详细示例。

3.20. 连接优先级

由于有两种配置连接的方式(使用 config/database.yml 或使用环境变量),因此了解它们如何交互非常重要。

如果您的 config/database.yml 文件为空但 ENV['DATABASE_URL'] 存在,则 Rails 将通过您的环境变量连接到数据库:

$ cat config/database.yml

$ echo $DATABASE_URL
postgresql:///my_database

如果您有 config/database.yml 但没有 ENV['DATABASE_URL'],则此文件将用于连接到您的数据库:

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

$ echo $DATABASE_URL

如果您同时设置了 config/database.ymlENV['DATABASE_URL'],则 Rails 将合并配置。为了更好地理解这一点,我们必须看一些示例。

当提供重复的连接信息时,环境变量将优先:

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

$ echo $DATABASE_URL
postgresql:///my_database

$ 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:///my_database">
  ]

这里,适配器、主机和数据库与 ENV['DATABASE_URL'] 中的信息匹配。

如果提供非重复信息,您将获得所有唯一值,在任何冲突情况下,环境变量仍然优先。

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

$ echo $DATABASE_URL
postgresql:///my_database

$ 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:///my_database">
  ]

由于 pool 不在 ENV['DATABASE_URL'] 提供的连接信息中,因此其信息被合并。由于 adapter 是重复的,因此 ENV['DATABASE_URL'] 连接信息获胜。

唯一明确不使用 ENV['DATABASE_URL'] 中连接信息的方法是使用 "url" 子键指定显式 URL 连接:

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

$ echo $DATABASE_URL
postgresql:///my_database

$ 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,因此最好明确表明您正在使用 ENV['DATABASE_URL'] 连接到数据库。这在生产环境中特别有用,因为您不应将数据库密码等秘密提交到源代码管理(如 Git)中。

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

现在行为很清楚,我们只使用 ENV['DATABASE_URL'] 中的连接信息。

3.20.1. 配置 SQLite3 数据库

Rails 内置支持 SQLite3,它是一个轻量级的无服务器数据库应用程序。虽然 Rails 更好地配置了 SQLite 以适应生产工作负载,但繁忙的生产环境可能会使 SQLite 过载。Rails 在创建新项目时默认使用 SQLite 数据库,因为它是一个无需配置即可运行的数据库,但您以后可以随时更改它。

以下是默认配置文件(config/database.yml)中开发环境的连接信息部分:

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

使用 sqlite3 gem v2.4.0 或更高版本时,通过配置 extensions 支持 SQLite 扩展

development:
  adapter: sqlite3
  extensions:
    - SQLean::UUID                     # module name responding to `.to_path`
    - .sqlpkg/nalgeon/crypto/crypto.so # or a filesystem path
    - <%= AppExtensions.location %>    # or ruby code returning a path

通过扩展,可以向 SQLite 添加许多有用的功能。您可能希望浏览 SQLite 扩展中心 或使用 sqlpkg-rubysqlean-ruby 等 gem 来简化扩展管理。

SQLite3Adapter 文档 中描述了其他配置选项。

3.20.2. 配置 MySQL 或 MariaDB 数据库

如果您选择使用 MySQL 或 MariaDB 而不是随附的 SQLite3 数据库,您的 config/database.yml 会略有不同。以下是开发部分:

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

如果您的开发数据库具有空密码的 root 用户,则此配置应该适合您。否则,请根据需要更改 development 部分中的用户名和密码。

如果您的 MySQL 版本是 5.5 或 5.6,并且希望默认使用 utf8mb4 字符集,请通过启用 innodb_large_prefix 系统变量来配置您的 MySQL 服务器以支持更长的键前缀。

MySQL 默认启用咨询锁,并用于使数据库迁移并发安全。您可以通过将 advisory_locks 设置为 false 来禁用咨询锁:

production:
  adapter: mysql2
  advisory_locks: false

3.20.3. 配置 PostgreSQL 数据库

如果您选择使用 PostgreSQL,您的 config/database.yml 将定制为使用 PostgreSQL 数据库:

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

默认情况下,Active Record 使用称为咨询锁的数据库功能。如果您使用 PgBouncer 等外部连接池器,则可能需要禁用此功能:

production:
  adapter: postgresql
  advisory_locks: false

如果启用,Active Record 默认情况下将为每个数据库连接创建最多 1000 个预处理语句。要修改此行为,您可以将 statement_limit 设置为不同的值:

production:
  adapter: postgresql
  statement_limit: 200

使用的预处理语句越多:您的数据库将需要更多的内存。如果您的 PostgreSQL 数据库达到内存限制,请尝试降低 statement_limit 或禁用预处理语句。

3.20.4. 为 JRuby 平台配置 SQLite3 数据库

如果您选择使用 SQLite3 并使用 JRuby,您的 config/database.yml 会略有不同。以下是开发部分:

development:
  adapter: jdbcsqlite3
  database: storage/development.sqlite3

3.20.5. 为 JRuby 平台配置 MySQL 或 MariaDB 数据库

如果您选择使用 MySQL 或 MariaDB 并使用 JRuby,您的 config/database.yml 会略有不同。以下是开发部分:

development:
  adapter: jdbcmysql
  database: blog_development
  username: root
  password:

3.20.6. 为 JRuby 平台配置 PostgreSQL 数据库

如果您选择使用 PostgreSQL 并使用 JRuby,您的 config/database.yml 会略有不同。以下是开发部分:

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

根据需要更改 development 部分中的用户名和密码。

3.20.7. 配置元数据存储

默认情况下,Rails 会将您的 Rails 环境和 schema 信息存储在一个名为 ar_internal_metadata 的内部表中。

要禁用每个连接的此功能,请在数据库配置中设置 use_metadata_table。这在使用共享数据库和/或无法创建表的数据库用户时非常有用。

development:
  adapter: postgresql
  use_metadata_table: false

3.20.8. 配置重试行为

默认情况下,如果出现问题,Rails 将自动重新连接到数据库服务器并重试某些查询。只有安全可重试(幂等)的查询才会重试。重试次数可以通过数据库配置中的 connection_retries 指定,或通过将值设置为 0 来禁用。默认重试次数为 1。

development:
  adapter: mysql2
  connection_retries: 3

数据库配置还允许配置 retry_deadline。如果配置了 retry_deadline,并且查询首次尝试时已超过指定时间,则即使该查询是幂等的并且还有 connection_retries 剩余,也不会重试。例如,retry_deadline 为 5 秒意味着,如果查询首次尝试以来已过去 5 秒,即使它是幂等的并且还有 connection_retries 剩余,我们也不会重试该查询。

此值默认为 nil,这意味着所有可重试的查询都将重试,无论经过的时间如何。此配置的值应以秒为单位指定。

development:
  adapter: mysql2
  retry_deadline: 5 # Stop retrying queries after 5 seconds

3.20.9. 配置查询缓存

默认情况下,Rails 会自动缓存查询返回的结果集。如果 Rails 在该请求或作业中再次遇到相同的查询,它将使用缓存的结果集,而不是再次针对数据库运行查询。

查询缓存存储在内存中,为了避免使用过多内存,它会在达到阈值时自动清除最近最少使用的查询。默认情况下,阈值为 100,但可以在 database.yml 中配置。

development:
  adapter: mysql2
  query_cache: 200

要完全禁用查询缓存,可以将其设置为 false

development:
  adapter: mysql2
  query_cache: false

3.21. 创建 Rails 环境

默认情况下,Rails 附带三个环境:“development”、“test”和“production”。虽然这些足以满足大多数用例,但在某些情况下您可能需要更多环境。

假设您有一个镜像生产环境但仅用于测试的服务器。这样的服务器通常称为“staging server”。要为该服务器定义一个名为“staging”的环境,只需创建一个名为 config/environments/staging.rb 的文件。由于这是一个类似生产的环境,您可以将 config/environments/production.rb 的内容复制作为起点,并从那里进行必要的更改。也可以像这样要求和扩展其他环境配置:

# config/environments/staging.rb
require_relative "production"

Rails.application.configure do
  # Staging overrides
end

该环境与默认环境没有区别,可以使用 bin/rails server -e staging 启动服务器,使用 bin/rails console -e staging 启动控制台,Rails.env.staging? 工作正常,等等。

3.22. 部署到子目录(相对 URL 根)

默认情况下,Rails 期望您的应用程序在根目录(例如 /)下运行。本节解释了如何在目录中运行您的应用程序。

假设我们要将应用程序部署到“/app1”。Rails 需要知道此目录才能生成适当的路由:

config.relative_url_root = "/app1"

或者,您可以设置 RAILS_RELATIVE_URL_ROOT 环境变量。

Rails 现在将在生成链接时预先添加“/app1”。

3.22.1. 使用 Passenger

Passenger 可以轻松地在子目录中运行您的应用程序。您可以在 Passenger 手册 中找到相关配置。

3.22.2. 使用反向代理

使用反向代理部署应用程序比传统部署具有明显的优势。它们允许您通过分层应用程序所需的组件来更好地控制服务器。

许多现代 Web 服务器可以用作代理服务器,以平衡缓存服务器或应用程序服务器等第三方元素。

您可以使用的此类应用程序服务器之一是 Unicorn,它运行在反向代理后面。

在这种情况下,您需要配置代理服务器(NGINX、Apache 等)以接受来自应用程序服务器(Unicorn)的连接。默认情况下,Unicorn 将侦听端口 8080 上的 TCP 连接,但您可以更改端口或将其配置为使用套接字。

您可以在 Unicorn 自述文件 中找到更多信息,并了解其背后的理念

配置好应用程序服务器后,您必须通过适当配置您的 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;
  }

  # some other configuration
}

请务必阅读 NGINX 文档 以获取最新信息。

4. Rails 环境设置

Rails 的某些部分也可以通过提供环境变量进行外部配置。Rails 的各个部分识别以下环境变量:

  • ENV["RAILS_ENV"] 定义 Rails 将在其中运行的 Rails 环境(生产、开发、测试等)。

  • 当您将应用程序部署到子目录时,路由代码使用 ENV["RAILS_RELATIVE_URL_ROOT"] 来识别 URL。

  • ENV["RAILS_CACHE_ID"]ENV["RAILS_APP_VERSION"] 用于在 Rails 的缓存代码中生成扩展缓存键。这允许您从同一个应用程序拥有多个独立的缓存。

5. 使用初始化器文件

加载框架和应用程序中的任何 gem 后,Rails 将加载初始化器。初始化器是应用程序中 config/initializers 下的任何 Ruby 文件。您可以使用初始化器来保存应在所有框架和 gem 加载后进行的配置设置,例如配置这些部分的选项。

config/initializers(以及 config/initializers 的任何子目录)中的文件将作为 load_config_initializers 初始化器的一部分进行排序和加载。

如果一个初始化器中的代码依赖于另一个初始化器中的代码,您可以将它们合并到一个初始化器中。这使得依赖关系更加明确,并有助于在应用程序中发现新概念。Rails 还支持初始化器文件名的编号,但这可能导致文件名频繁更改。不建议使用 require 显式加载初始化器,因为它会导致初始化器加载两次。

不能保证您的初始化器将在所有 gem 初始化器之后运行,因此任何依赖于给定 gem 已初始化的初始化代码都应放在 config.after_initialize 块中。

6. 加载钩子

Rails 代码通常可以在应用程序加载时引用。Rails 负责这些框架的加载顺序,因此当您过早地加载 ActiveRecord::Base 等框架时,您就违反了您的应用程序与 Rails 之间的隐式契约。此外,通过在应用程序启动时加载 ActiveRecord::Base 等代码,您正在加载整个框架,这可能会减慢启动时间,并可能导致加载顺序和应用程序启动冲突。

加载和配置钩子是允许您在不违反与 Rails 的加载契约的情况下挂接到此初始化过程的 API。这还将减轻启动性能下降并避免冲突。

6.1. 避免加载 Rails 框架

由于 Ruby 是一种动态语言,某些代码会导致不同的 Rails 框架加载。以下面这段代码为例:

ActiveRecord::Base.include(MyActiveRecordHelper)

这段代码意味着当这个文件加载时,它将遇到 ActiveRecord::Base。这次遇到会导致 Ruby 查找该常量的定义并需要它。这会导致整个 Active Record 框架在启动时加载。

ActiveSupport.on_load 是一种机制,可用于将代码的加载推迟到实际需要时。上面的代码片段可以更改为:

ActiveSupport.on_load(:active_record) do
  include MyActiveRecordHelper
end

这个新的代码片段只有在加载 ActiveRecord::Base 时才会包含 MyActiveRecordHelper

6.2. 钩子何时调用?

在 Rails 框架中,当加载特定库时,会调用这些钩子。例如,当加载 ActionController::Base 时,会调用 :action_controller_base 钩子。这意味着所有带有 :action_controller_base 钩子的 ActiveSupport.on_load 调用都将在 ActionController::Base 的上下文中调用(这意味着 self 将是 ActionController::Base)。

6.3. 修改代码以使用加载钩子

修改代码通常很简单。如果您的代码行引用了 ActiveRecord::Base 等 Rails 框架,您可以将该代码包装在加载钩子中。

修改 include 调用:

ActiveRecord::Base.include(MyActiveRecordHelper)

变为:

ActiveSupport.on_load(:active_record) do
  # self refers to ActiveRecord::Base here,
  # so we can call .include
  include MyActiveRecordHelper
end

修改 prepend 调用:

ActionController::Base.prepend(MyActionControllerHelper)

变为:

ActiveSupport.on_load(:action_controller_base) do
  # self refers to ActionController::Base here,
  # so we can call .prepend
  prepend MyActionControllerHelper
end

修改类方法调用:

ActiveRecord::Base.include_root_in_json = true

变为:

ActiveSupport.on_load(:active_record) do
  # self refers to ActiveRecord::Base here
  self.include_root_in_json = true
end

6.4. 可用加载钩子

这些是您可以在自己的代码中使用的加载钩子。要挂接到以下某个类的初始化过程,请使用可用的钩子。

钩子
ActionCable action_cable
ActionCable::Channel::Base action_cable_channel
ActionCable::Connection::Base action_cable_connection
ActionCable::Connection::TestCase action_cable_connection_test_case
ActionController::API action_controller_api
ActionController::API action_controller
ActionController::Base action_controller_base
ActionController::Base action_controller
ActionController::TestCase action_controller_test_case
ActionDispatch::IntegrationTest action_dispatch_integration_test
ActionDispatch::Response action_dispatch_response
ActionDispatch::Request action_dispatch_request
ActionDispatch::SystemTestCase action_dispatch_system_test_case
ActionMailbox::Base action_mailbox
ActionMailbox::InboundEmail action_mailbox_inbound_email
ActionMailbox::Record action_mailbox_record
ActionMailbox::TestCase action_mailbox_test_case
ActionMailer::Base action_mailer
ActionMailer::TestCase action_mailer_test_case
ActionText::Content action_text_content
ActionText::Record action_text_record
ActionText::RichText action_text_rich_text
ActionText::EncryptedRichText action_text_encrypted_rich_text
ActionView::Base action_view
ActionView::TestCase action_view_test_case
ActiveJob::Base active_job
ActiveJob::TestCase active_job_test_case
ActiveModel::Model active_model
ActiveModel::Translation active_model_translation
ActiveRecord::Base active_record
ActiveRecord::DatabaseConfigurations active_record_database_configurations
ActiveRecord::Encryption active_record_encryption
ActiveRecord::TestFixtures active_record_fixtures
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter active_record_postgresqladapter
ActiveRecord::ConnectionAdapters::Mysql2Adapter active_record_mysql2adapter
ActiveRecord::ConnectionAdapters::TrilogyAdapter active_record_trilogyadapter
ActiveRecord::ConnectionAdapters::SQLite3Adapter active_record_sqlite3adapter
ActiveStorage::Attachment active_storage_attachment
ActiveStorage::VariantRecord active_storage_variant_record
ActiveStorage::Blob active_storage_blob
ActiveStorage::Record active_storage_record
ActiveSupport::TestCase active_support_test_case
i18n i18n

7. 初始化事件

Rails 有 5 个初始化事件可以挂接(按运行顺序):

  • before_configuration:当应用程序类在 config/application.rb 中继承自 Rails::Application 时运行。在类主体执行之前。引擎可以使用此钩子在应用程序本身配置之前运行代码。

  • before_initialize:在应用程序初始化过程(在 Rails 初始化过程开始时的 :bootstrap_hook 初始化器附近)发生之前直接运行。

  • to_prepare:在所有 Railties(包括应用程序本身)的初始化器运行之后和中间件堆栈构建之后运行,但在提前加载之前。更重要的是,它将在 development 中每次代码重新加载时运行,但在 productiontest 中只运行一次(在启动期间)。

  • before_eager_load:在提前加载发生之前直接运行,这是 production 环境的默认行为,而不是 development 环境的默认行为。

  • after_initialize:在应用程序初始化之后,在 config/initializers 中的应用程序初始化器运行之后直接运行。

要为这些钩子定义事件,请在 Rails::ApplicationRails::RailtieRails::Engine 子类中使用块语法:

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

或者,您也可以通过 Rails.application 对象的 config 方法来完成:

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

在调用 after_initialize 块时,应用程序的某些部分,尤其是路由,尚未设置。

7.1. 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 方法接受三个参数,第一个是初始化器的名称,第二个是选项哈希(此处未显示),第三个是块。选项哈希中的 :before 键可以指定此新初始化器必须在其之前运行的初始化器,:after 键将指定此初始化器在其之后运行的初始化器。

使用 initializer 方法定义的初始化器将按其定义的顺序运行,使用 :before:after 方法的除外。

您可以将初始化器放在链中任何其他初始化器之前或之后,只要它是逻辑的。假设您有 4 个初始化器,称为“一”到“四”(按该顺序定义),并且您将“四”定义为在“二”之前但在“三”之后运行,这不合逻辑,Rails 将无法确定您的初始化器顺序。

initializer 方法的块参数是应用程序本身的实例,因此我们可以通过使用 config 方法访问其配置,如示例所示。

因为 Rails::Application 继承自 Rails::Railtie(间接),所以您可以在 config/application.rb 中使用 initializer 方法来为应用程序定义初始化器。

7.2. 初始化器

以下是 Rails 中所有初始化器的完整列表,按其定义的顺序(因此也是运行顺序,除非另有说明)排列。

  • load_environment_hook:作为一个占位符,以便可以定义 :load_environment_config 在其之前运行。

  • load_active_support:如果 config.active_support.bare 为非真值(默认值),则可选地要求 active_support/all

  • initialize_logger:为应用程序初始化日志记录器(一个 ActiveSupport::BroadcastLogger 对象),并使其可通过 Rails.logger 访问,前提是此点之前没有初始化器定义 Rails.logger

  • initialize_cache:如果 Rails.cache 尚未设置,则通过引用 config.cache_store 中的值来初始化缓存,并将结果存储为 Rails.cache。如果此对象响应 middleware 方法,则其中间件将插入到中间件堆栈中 Rack::Runtime 之前。

  • set_clear_dependencies_hook:此初始化器——仅在 config.enable_reloading 设置为 true 时运行——使用 ActionDispatch::Callbacks.after 从对象空间中移除在请求期间引用的常量,以便它们将在后续请求期间重新加载。

  • bootstrap_hook:运行所有配置的 before_initialize 块。

  • i18n.callbacks:在开发环境中,设置一个 to_prepare 回调,如果任何语言环境自上次请求以来已更改,它将调用 I18n.reload!。在生产环境中,此回调只会在第一个请求时运行。

  • active_support.deprecation_behavior:根据 Rails.application.deprecators 设置 config.active_support.report_deprecationsconfig.active_support.deprecationconfig.active_support.disallowed_deprecationconfig.active_support.disallowed_deprecation_warnings 的弃用报告行为。

  • active_support.initialize_time_zone:根据 config.time_zone 设置(默认为“UTC”)设置应用程序的默认时区。

  • active_support.initialize_beginning_of_week:根据 config.beginning_of_week 设置(默认为 :monday)设置应用程序的默认一周开始时间。

  • active_support.set_configs:通过将 config.active_support 中的设置作为设置器 sendActiveSupport 并传递值来设置 Active Support。

  • action_dispatch.configure:配置 ActionDispatch::Http::URL.tld_length,将其设置为 config.action_dispatch.tld_length 的值。

  • action_view.set_configs:通过将 config.action_view 中的设置作为设置器 sendActionView::Base 并传递值来设置 Action View。

  • action_controller.assets_config:如果未明确配置,则将 config.action_controller.assets_dir 初始化为应用程序的公共目录。

  • action_controller.set_helpers_path:将 Action Controller 的 helpers_path 设置为应用程序的 helpers_path

  • action_controller.parameters_config:配置 ActionController::Parameters 的强参数选项。

  • action_controller.set_configs:通过将 config.action_controller 中的设置作为设置器 sendActionController::Base 并传递值来设置 Action Controller。

  • action_controller.compile_config_methods:初始化指定配置设置的方法,以便更快地访问它们。

  • active_record.initialize_timezone:将 ActiveRecord::Base.time_zone_aware_attributes 设置为 true,并将 ActiveRecord::Base.default_timezone 设置为 UTC。当从数据库读取属性时,它们将转换为 Time.zone 指定的时区。

  • active_record.logger:如果尚未设置,则将 ActiveRecord::Base.logger 设置为 Rails.logger

  • active_record.migration_error:配置中间件以检查待处理的迁移。

  • active_record.check_schema_cache_dump:如果已配置且可用,则加载 schema 缓存转储。

  • active_record.set_configs:通过将 config.active_record 中的设置作为设置器 sendActiveRecord::Base 并传递值来设置 Active Record。

  • active_record.initialize_database:从 config/database.yml 加载数据库配置(默认情况下)并为当前环境建立连接。

  • active_record.log_runtime:包含 ActiveRecord::Railties::ControllerRuntimeActiveRecord::Railties::JobRuntime,它们负责向日志记录器报告 Active Record 调用请求所花费的时间。

  • active_record.set_reloader_hooks:如果 config.enable_reloading 设置为 true,则重置所有可重新加载的数据库连接。

  • active_record.add_watchable_files:将 schema.rbstructure.sql 文件添加到可监视文件中。

  • active_job.logger:如果尚未设置,则将 ActiveJob::Base.logger 设置为 Rails.logger

  • active_job.set_configs:通过将 config.active_job 中的设置作为设置器 sendActiveJob::Base 并传递值来设置 Active Job。

  • action_mailer.logger:如果尚未设置,则将 ActionMailer::Base.logger 设置为 Rails.logger

  • action_mailer.set_configs:通过将 config.action_mailer 中的设置作为设置器 sendActionMailer::Base 并传递值来设置 Action Mailer。

  • action_mailer.compile_config_methods:初始化指定配置设置的方法,以便更快地访问它们。

  • set_load_path:此初始化器在 bootstrap_hook 之前运行。将 config.paths.load_paths 指定的路径添加到 $LOAD_PATH。除非您将 config.add_autoload_paths_to_load_path 设置为 false,否则它还将添加 config.autoload_pathsconfig.eager_load_pathsconfig.autoload_once_paths 指定的所有自动加载路径。

  • 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 文件(在应用程序和 railties 中,包括引擎)并为应用程序设置路由。

  • add_locales:将 config/locales 中的文件(来自应用程序、railties 和引擎)添加到 I18n.load_path,使这些文件中的翻译可用。

  • add_view_paths:将应用程序、railties 和引擎中的 app/views 目录添加到应用程序视图文件的查找路径。

  • add_mailer_preview_paths:将应用程序、railties 和引擎中的 test/mailers/previews 目录添加到应用程序邮件程序预览文件的查找路径。

  • load_environment_config:此初始化器在 load_environment_hook 之前运行。加载当前环境的 config/environments 文件。

  • prepend_helpers_path:将应用程序、railties 和引擎中的 app/helpers 目录添加到应用程序助手的查找路径。

  • load_config_initializers:加载应用程序、railties 和引擎中 config/initializers 中的所有 Ruby 文件。此目录中的文件可用于保存应在所有框架加载后进行的配置设置。

  • engines_blank_point:如果您希望在引擎加载之前执行任何操作,则提供一个初始化点。在此之后,所有 railtie 和引擎初始化器都会运行。

  • 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:应用程序、railtie 或引擎中每个 config.to_prepare 调用的块都添加到 Action Dispatch 的 to_prepare 回调中,这些回调将在开发环境中按请求运行,或在生产环境中在第一个请求之前运行。

  • add_builtin_route:如果应用程序在开发环境下运行,则此路由将 rails/info/properties 的路由附加到应用程序路由。此路由为默认 Rails 应用程序中的 public/index.html 提供详细信息,例如 Rails 和 Ruby 版本。

  • build_middleware_stack:为应用程序构建中间件堆栈,返回一个具有 call 方法的对象,该方法接受一个 Rack 环境对象进行请求。

  • eager_load!:如果 config.eager_loadtrue,则运行 config.before_eager_load 钩子,然后调用 eager_load!,这将加载所有 config.eager_load_namespaces

  • finisher_hook:在应用程序初始化过程完成后提供一个钩子,并运行应用程序、railties 和引擎的所有 config.after_initialize 块。

  • set_routes_reloader_hook:配置 Action Dispatch 以使用 ActiveSupport::Callbacks.to_run 重新加载路由文件。

  • disable_dependency_loading:如果 config.eager_load 设置为 true,则禁用自动依赖加载。

8. 数据库池

Active Record 数据库连接由 ActiveRecord::ConnectionAdapters::ConnectionPool 管理,它确保连接池同步对有限数量数据库连接的线程访问。此限制默认为 5,可在 database.yml 中配置。

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

由于连接池默认由 Active Record 内部处理,因此所有应用程序服务器(Thin、Puma、Unicorn 等)的行为都应相同。数据库连接池最初是空的。随着对连接的需求增加,它将创建连接,直到达到连接池限制。

任何一个请求在第一次需要访问数据库时都会检出连接。在请求结束时,它会将连接检回。这意味着额外的连接槽将再次可用于队列中的下一个请求。

如果您尝试使用超出可用数量的连接,Active Record 将阻止您并等待连接池中的连接。如果无法获取连接,则会抛出类似于下面给出的超时错误。

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

如果您收到上述错误,您可能需要通过增加 database.yml 中的 pool 选项来增加连接池的大小:

如果您在多线程环境中运行,则可能有几个线程同时访问多个连接。因此,根据您当前的请求负载,您很可能会有多个线程争用有限数量的连接。

9. 自定义配置

您可以通过 Rails 配置对象配置自己的代码,在 config.x 命名空间下或直接在 config 下进行自定义配置。两者之间的主要区别在于,如果您定义嵌套配置(例如:config.x.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 }

10. 搜索引擎索引

有时,您可能希望阻止应用程序的某些页面在 Google、Bing、Yahoo 或 Duck Duck Go 等搜索网站上可见。索引这些网站的机器人将首先分析 http://your-site.com/robots.txt 文件,以了解允许索引哪些页面。

Rails 会在 /public 文件夹中为您创建此文件。默认情况下,它允许搜索引擎索引应用程序的所有页面。如果您想阻止索引应用程序的所有页面,请使用以下内容:

User-agent: *
Disallow: /

要仅阻止特定页面,需要使用更复杂的语法。请参阅官方文档了解更多信息。



回到顶部