更多内容请访问 rubyonrails.org:

1 初始化代码的位置

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

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

2 在 Rails 之前运行代码

在您的应用程序需要在 Rails 本身加载之前运行某些代码的罕见情况下,请将其放在 config/application.rb 中调用 require "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 将加载从版本 1 到版本 6.1 的所有版本的默认值。

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

3.1.1 目标版本 8.0 的默认值

3.1.2 目标版本 7.2 的默认值

3.1.3 目标版本 7.1 的默认值

3.1.4 目标版本 7.0 的默认值

3.1.5 针对目标版本 6.1 的默认值

3.1.6 针对目标版本 6.0 的默认值

3.1.7 针对目标版本 5.2 的默认值

3.1.8 针对目标版本 5.1 的默认值

3.1.9 针对目标版本 5.0 的默认值

3.2 Rails 通用配置

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

3.2.1 config.add_autoload_paths_to_load_path

指定是否需要将自动加载路径添加到 $LOAD_PATH。建议在 :zeitwerk 模式下,在 config/application.rb 中将其设置为 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_once,即使从应用程序初始化程序中也可以自动加载 lib 中的类和模块,但不会重新加载。

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_directives

请参阅安全指南中的添加随机数

3.2.19 config.content_security_policy_nonce_generator

请参阅安全指南中的添加随机数

3.2.20 config.content_security_policy_report_only

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

3.2.21 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.22 config.credentials.key_path

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

默认情况下,如果存在,则为config/credentials/#{Rails.env}.key,否则为config/master.key

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

3.2.23 config.debug_exception_response_format

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

3.2.24 config.disable_sandbox

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

3.2.25 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.26 config.eager_load

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

3.2.27 config.eager_load_namespaces

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

3.2.28 config.eager_load_paths

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

3.2.29 config.enable_reloading

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

谓词 config.reloading_enabled? 也已定义。

3.2.30 config.encoding

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

3.2.31 config.exceptions_app

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

异常应用程序需要处理 ActionDispatch::Http::MimeNegotiation::InvalidType 错误,这些错误是在客户端发送无效的 AcceptContent-Type 标头时引发的。默认的 ActionDispatch::PublicExceptions 应用程序会自动执行此操作,将 Content-Type 设置为 text/html 并返回 406 Not Acceptable 状态。无法处理此错误将导致 500 Internal Server Error

使用 Rails.application.routes RouteSet 作为异常应用程序也需要这种特殊处理。它可能看起来像这样

# config/application.rb
config.exceptions_app = CustomExceptionsAppWrapper.new(exceptions_app: routes)

# lib/custom_exceptions_app_wrapper.rb
class CustomExceptionsAppWrapper
  def initialize(exceptions_app:)
    @exceptions_app = exceptions_app
  end

  def call(env)
    request = ActionDispatch::Request.new(env)

    fallback_to_html_format_if_invalid_mime_type(request)

    @exceptions_app.call(env)
  end

  private
    def fallback_to_html_format_if_invalid_mime_type(request)
      request.formats
    rescue ActionDispatch::Http::MimeNegotiation::InvalidType
      request.set_header "CONTENT_TYPE", "text/html"
    end
end

3.2.32 config.file_watcher

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

使用 ActiveSupport::EventedFileUpdateChecker 依赖于 listen gem

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

在 Linux 和 macOS 上不需要额外的 gem,但有些是必需的 *BSDWindows

注意 某些设置不受支持

3.2.33 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.34 config.filter_redirect

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

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

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

3.2.35 config.force_ssl

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

3.2.36 config.helpers_paths

定义一个用于加载视图助手的附加路径数组。

3.2.37 config.host_authorization

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

3.2.38 config.hosts

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

3.2.39 config.javascript_path

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

3.2.40 config.log_file_size

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

3.2.41 config.log_formatter

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

3.2.42 config.log_level

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

3.2.43 config.log_tags

接受 request 对象响应的方法列表、接受 request 对象的 Proc,或者响应 to_s 的内容。这使得使用调试信息(如子域和请求 ID)轻松标记日志行变得容易,这两者在调试多用户生产应用程序时非常有用。

3.2.44 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.45 config.middleware

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

3.2.46 config.precompile_filter_parameters

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

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

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

3.2.47 config.public_file_server.enabled

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

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

3.2.48 config.railties_order

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

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

3.2.49 config.rake_eager_load

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

3.2.50 config.relative_url_root

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

3.2.51 config.reload_classes_only_on_change

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

3.2.52 config.require_master_key

导致应用程序在主密钥未通过 ENV["RAILS_MASTER_KEY"]config/master.key 文件提供时无法启动。

3.2.53 config.sandbox_by_default

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

3.2.54 config.secret_key_base

为应用程序的密钥生成器指定输入密钥的回退。建议将其保留为空,并在 config/credentials.yml.enc 中指定 secret_key_base。有关更多信息和备用配置方法,请参见 secret_key_base API 文档

3.2.55 config.server_timing

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

3.2.56 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.57 config.session_store

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

此设置是通过常规方法调用配置的,而不是通过设置器配置的。这允许传递额外的选项

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.58 config.silence_healthcheck_path

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

config.silence_healthcheck_path = "/up"

3.2.59 config.ssl_options

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

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

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

3.2.60 config.time_zone

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

3.2.61 config.x

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

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

参见 自定义配置

3.2.62 config.yjit

从 Ruby 3.3 开始启用 YJIT,以带来可观的性能提升。如果您部署到内存受限的环境,您可能需要将其设置为false

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

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

一个标志,它启用创建编译资产的 gzip 版本,以及非 gzip 资产。默认设置为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

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

3.3.9 config.assets.digest

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

3.3.10 config.assets.debug

禁用资产的连接和压缩。在development.rb中默认设置为true

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_controller不同于resource_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"

请求的主机使用案例运算符(#===)针对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 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]
    
  • 或者,您可以为语言环境单独设置不同的回退。例如,如果您希望对 `:az` 和 `:de` 使用 `:tr`,对 `:da` 使用 `:en` 作为回退,您可以执行以下操作。

    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

控制是否可以在 i18n 语言环境文件中覆盖 Error#full_message 格式。默认情况下为 `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

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

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` 表。

3.8.9 config.active_record.default_timezone

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

3.8.10 config.active_record.schema_format

控制将数据库模式转储到文件的格式。选项有 `:ruby`(默认值),用于独立于数据库的版本,该版本依赖于迁移,或 `:sql`,用于一组(可能依赖于数据库的)SQL 语句。

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

控制在迁移中执行模式语句方法的策略类。默认类委托给连接适配器。自定义策略应该继承自 `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.lock_optimistically

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

3.8.19 config.active_record.cache_timestamp_format

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

3.8.20 config.active_record.record_timestamps

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

3.8.21 config.active_record.partial_inserts

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

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

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

3.8.22 config.active_record.partial_updates

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

3.8.23 config.active_record.maintain_test_schema

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

3.8.24 config.active_record.dump_schema_after_migration

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

3.8.25 config.active_record.dump_schemas

控制在调用 `db:schema:dump` 时将转储哪些数据库模式。选项有 `:schema_search_path`(默认值),它转储 `schema_search_path` 中列出的任何模式,`:all` 始终转储所有模式,无论 `schema_search_path` 是什么,或者是一个用逗号分隔的模式字符串。

3.8.26 config.active_record.before_committed_on_all_records

在事务中所有注册的记录上启用 before_committed! 回调。以前的行为是在事务中注册了相同记录的多个副本时,只在记录的第一个副本上运行回调。

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

3.8.27 config.active_record.belongs_to_required_by_default

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

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

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

3.8.28 config.active_record.belongs_to_required_validates_foreign_key

启用仅对父相关的列进行存在验证,前提是父项是强制性的。以前的行为是对父记录的存在进行验证,这会在每次更新子记录时执行额外的查询以获取父项,即使父项没有改变。

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

3.8.29 config.active_record.marshalling_format_version

当设置为 `7.1` 时,将启用使用 `Marshal.dump` 对 Active Record 实例进行更有效的序列化。

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

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

3.8.30 config.active_record.action_on_strict_loading_violation

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

3.8.31 config.active_record.strict_loading_by_default

一个布尔值,默认情况下启用或禁用 strict_loading 模式。默认为 false

3.8.32 config.active_record.strict_loading_mode

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

3.8.33 config.active_record.index_nested_attribute_errors

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

3.8.34 config.active_record.use_schema_cache_dump

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

3.8.35 config.active_record.cache_versioning

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

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

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

3.8.36 config.active_record.collection_cache_versioning

启用在类型为 ActiveRecord::Relation 的被缓存对象更改时重复使用相同的缓存键,方法是将关系缓存键的易变信息(最大更新时间和计数)移动到缓存版本中,以支持缓存键回收。

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

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

3.8.37 config.active_record.has_many_inversing

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

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

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

3.8.38 config.active_record.automatic_scope_inversing

启用自动推断具有作用域的关联的 inverse_of

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

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

3.8.39 config.active_record.destroy_association_async_job

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

3.8.40 config.active_record.destroy_association_async_batch_size

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

3.8.41 config.active_record.queues.destroy

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

3.8.42 config.active_record.enumerate_columns_in_select_statements

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

3.8.43 config.active_record.verify_foreign_keys_for_fixtures

确保在测试中加载夹具后所有外键约束均有效。仅由 PostgreSQL 和 SQLite 支持。

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

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

3.8.44 config.active_record.raise_on_assign_to_attr_readonly

启用在分配给 attr_readonly 属性时引发异常。以前的行为将允许分配,但会静默地不将更改持久化到数据库。

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

3.8.45 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.46 config.active_record.default_column_serializer

如果未为给定列显式指定序列化器实现,则要使用的序列化器实现。

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

因此,建议优先使用更严格、更有限的格式进行数据库序列化。

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

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

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

3.8.47 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.48 config.active_record.query_log_tags_enabled

指定是否启用适配器级查询注释。默认为 false

当此选项设置为 true 时,数据库准备好的语句将自动禁用。

3.8.49 config.active_record.query_log_tags

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

3.8.50 config.active_record.query_log_tags_format

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

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

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

3.8.51 config.active_record.cache_query_log_tags

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

3.8.52 config.active_record.schema_cache_ignored_tables

定义生成架构缓存时应忽略的表列表。它接受一个字符串数组,表示表名或正则表达式。

3.8.53 config.active_record.verbose_query_logs

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

3.8.54 config.active_record.sqlite3_adapter_strict_strings_by_default

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

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

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

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

3.8.55 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.56 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_thread 属性进行单独配置。这对于定期查询多个数据库并在需要更精确地定义最大并发性的应用程序非常有用。

3.8.57 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.58 config.active_record.yaml_column_permitted_classes

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

3.8.59 config.active_record.use_yaml_unsafe_load

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

3.8.60 config.active_record.raise_int_wider_than_64bit

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

3.8.61 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.62 config.active_record.permanent_connection_checkout

控制 ActiveRecord::Base.connection 是否引发错误,发出弃用警告,或两者都不执行。

ActiveRecord::Base.connection 从连接池中检出一个数据库连接,并在请求或作业结束之前一直保持租赁状态。这种行为在使用比可用连接更多的线程或纤程的环境中可能不理想。

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

该值可以设置为 :disallowed:deprecatedtrue,分别表示引发错误、发出弃用警告或不执行任何操作。

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

3.8.63 config.active_record.database_cli

控制在运行 rails dbconsole 时用于访问数据库的 CLI 工具。默认情况下,将使用数据库的标准工具(例如,对于 PostgreSQL 使用 psql,对于 MySQL 使用 mysql)。该选项接受一个哈希,它为每个数据库系统指定了工具,并且可以使用数组来指定备用选项。

# config/application.rb

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

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

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

3.8.65 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.66 ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.datetime_type

控制 Active Record PostgreSQL 适配器在迁移或模式中调用 datetime 时应该使用哪个本机类型。它接受一个符号,该符号必须对应于已配置的 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.67 ActiveRecord::SchemaDumper.ignore_tables

接受一个表格数组,这些表格不应该包含在任何生成的模式文件中。

3.8.68 ActiveRecord::SchemaDumper.fk_ignore_pattern

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

3.8.69 config.active_record.encryption.add_to_filter_parameters

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

默认值为 true

3.8.70 config.active_record.encryption.hash_digest_class

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

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

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

3.8.71 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.72 config.active_record.encryption.compressor

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

您可以通过将此设置为对 deflateinflate 响应的类来使用自己的压缩器。

3.8.73 config.active_record.protocol_adapters

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

config.active_record.protocol_adapters.mysql = "trilogy"

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

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 表示不执行任何操作
  • :log 表示在 unpermitted_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

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

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

3.9.18 config.action_controller.log_query_tags_around_actions

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

3.9.19 config.action_controller.wrap_parameters_by_default

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

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

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

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

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

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

3.9.20 ActionController::Base.wrap_parameters

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

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.ignore_accept_header

用于确定是否忽略请求中的 Accept 头信息。默认为 false

3.10.7 config.action_dispatch.x_sendfile_header

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

3.10.8 config.action_dispatch.http_auth_salt

设置 HTTP 身份验证盐值。默认为 'http authentication'

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

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

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

设置经过身份验证的加密 cookie 的盐值。默认为 'authenticated encrypted cookie'

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

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

3.10.15 config.action_dispatch.cookies_rotations

允许旋转加密和签名 cookie 的密钥、密码和摘要算法。

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

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

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

3.10.17 config.action_dispatch.use_cookies_with_metadata

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

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

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

3.10.18 config.action_dispatch.perform_deep_munge

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

3.10.19 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 内部服务器错误。

3.10.20 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.21 config.action_dispatch.ssl_default_redirect_status

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

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

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

3.10.22 config.action_dispatch.log_rescued_responses

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

3.10.23 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.11 config.action_dispatch.strict_freshness

配置 ActionDispatch::ETag 中间件在响应中同时存在 ETagLast-Modified 头信息时是否应该优先使用 ETag 头信息。

如果设置为 true,则当两个头信息都存在时,只考虑 ETag,如 RFC 7232 第 6 节所指定。

如果设置为 false,则当两个头信息都存在时,会检查两个头信息,并且两个头信息都需要匹配,才能将响应视为新鲜的。

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

如果 cookie 被标记为不安全,或者请求是在 SSL 上进行的,或者请求是发送到洋葱网络的,则 cookie 将在请求结束时被写入。

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

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

3.11.2 ActionDispatch::Callbacks.before

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

3.11.3 ActionDispatch::Callbacks.after

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

3.12 配置 Action View

config.action_view 包含少量配置设置

3.12.1 config.action_view.cache_template_loading

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

3.12.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.12.3 config.action_view.default_form_builder

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

3.12.4 config.action_view.logger

接受一个符合 Log4r 接口或默认 Ruby Logger 类的日志记录器,然后使用它来记录来自 Action View 的信息。设置为 nil 以禁用日志记录。

3.12.5 config.action_view.erb_trim_mode

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

3.12.6 config.action_view.frozen_string_literal

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

3.12.7 config.action_view.embed_authenticity_token_in_remote_forms

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

3.12.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.12.9 config.action_view.automatically_disable_submit_tag

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

3.12.10 config.action_view.debug_missing_translation

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

3.12.11 config.action_view.form_with_generates_remote_forms

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

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

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

3.12.12 config.action_view.form_with_generates_ids

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

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

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

3.12.13 config.action_view.default_enforce_utf8

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

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

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

3.12.14 config.action_view.image_loading

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

3.12.15 config.action_view.image_decoding

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

3.12.16 config.action_view.annotate_rendered_view_with_filenames

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

确定 javascript_include_tagstylesheet_link_tag 是否会生成一个预加载资产的 link 头信息。

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

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

3.12.18 config.action_view.button_to_generates_button_tag

当为 false 时,button_to 将根据内容的传递方式渲染一个 <button> 或一个 <input> 在一个 <form> 中(<form> 省略,以简洁起见)

<%= 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.12.19 config.action_view.apply_stylesheet_media_default

确定 stylesheet_link_tag 在没有提供 media 属性时是否会渲染 screen 作为 media 属性的默认值。

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

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

3.12.20 config.action_view.prepend_content_exfiltration_prevention

确定 form_tagbutton_to 辅助方法是否会生成以浏览器安全的(但技术上无效的)HTML 为前缀的 HTML 标签,这些标签保证它们的内容不能被任何前面的未关闭标签捕获。默认值为 false

3.12.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 (参见备注) HTML5

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

3.13 配置 Action Mailbox

config.action_mailbox 提供以下配置选项

3.13.1 config.action_mailbox.logger

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

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

3.13.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.13.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.13.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.13.5 config.action_mailbox.storage_service

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

3.14 配置 Action Mailer

config.action_mailer 提供了一些配置选项

3.14.1 config.action_mailer.asset_host

设置资产的 host。当使用 CDN 来托管资产而不是应用程序服务器本身时,这很有用。只有在您为 Action Controller 设置了不同的配置时才应该使用它,否则请使用 config.asset_host

3.14.2 config.action_mailer.logger

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

3.14.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:SMTP 通过直接 TLS 连接)。
  • :open_timeout - 尝试打开连接时等待的秒数。
  • :read_timeout - 在对 read(2) 调用超时之前等待的秒数。

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

3.14.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.14.5 config.action_mailer.sendmail_settings

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

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

3.14.6 config.action_mailer.file_settings

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

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

3.14.7 config.action_mailer.raise_delivery_errors

指定如果电子邮件传递无法完成是否引发错误。默认值为 true

3.14.8 config.action_mailer.delivery_method

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

3.14.9 config.action_mailer.perform_deliveries

指定是否实际传递邮件,默认值为 true。在测试时将其设置为 false 可能会很方便。

3.14.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: "[email protected]"
}

3.14.11 config.action_mailer.observers

注册观察者,这些观察者将在邮件传递时收到通知。

config.action_mailer.observers = ["MailObserver"]

3.14.12 config.action_mailer.interceptors

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

config.action_mailer.interceptors = ["MailInterceptor"]

3.14.13 config.action_mailer.preview_interceptors

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

config.action_mailer.preview_interceptors = ["MyPreviewMailInterceptor"]

3.14.14 config.action_mailer.preview_paths

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

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

3.14.15 config.action_mailer.show_previews

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

config.action_mailer.show_previews = false

3.14.16 config.action_mailer.perform_caching

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

3.14.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.14.18 config.action_mailer.delivery_job

指定邮件的传递作业。

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

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

3.15 配置 Active Support

Active Support 提供了一些配置选项

3.15.1 config.active_support.bare

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

3.15.2 config.active_support.test_order

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

3.15.3 config.active_support.escape_html_entities_in_json

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

3.15.4 config.active_support.use_standard_json_time_format

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

3.15.5 config.active_support.time_precision

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

3.15.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.15.7 config.active_support.key_generator_hash_digest_class

允许配置用于从配置的秘密基础派生秘密的摘要类,例如用于加密 cookie。

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

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

3.15.8 config.active_support.use_authenticated_message_encryption

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

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

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

3.15.9 config.active_support.message_serializer

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

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

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

:message_pack:message_pack_allow_marshal 序列化器支持对某些 Ruby 类型进行往返转换,而这些类型不受 JSON 支持,例如 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.15.10 config.active_support.use_message_serializer_for_metadata

如果为true,则启用一项性能优化,该优化将消息数据和元数据串行化在一起。这会更改消息格式,因此以这种方式串行化的消息无法由旧版(< 7.1)的 Rails 版本读取。但是,无论是否启用此优化,都可以读取使用旧格式的消息。

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

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

3.15.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.15.12 config.active_support.deprecation

配置弃用警告的行为。有关可用选项的说明,请参见 Deprecation::Behavior

在默认生成的 config/environments 文件中,对于开发环境,此值设置为:log,对于测试环境,此值设置为:stderr,而对于生产环境,则省略该值,转而使用 config.active_support.report_deprecations

3.15.13 config.active_support.disallowed_deprecation

配置不允许的弃用警告的行为。有关可用选项的说明,请参见 Deprecation::Behavior

在默认生成的 config/environments 文件中,对于开发环境和测试环境,此值均设置为:raise,而对于生产环境,则省略该值,转而使用 config.active_support.report_deprecations

3.15.14 config.active_support.disallowed_deprecation_warnings

配置应用程序认为不允许的弃用警告。例如,这允许将特定的弃用视为严重错误。

3.15.15 config.active_support.report_deprecations

如果为false,则禁用来自 应用程序的弃用器 的所有弃用警告,包括不允许的弃用警告。这包括来自 Rails 和其他可能将它们的弃用器添加到弃用器集合中,但可能无法阻止 ActiveSupport::Deprecation 发出的所有弃用警告的 gem 的所有弃用警告。

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

3.15.16 config.active_support.isolation_level

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

3.15.17 config.active_support.executor_around_test_case

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

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

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

3.15.18 config.active_support.to_time_preserves_timezone

指定to_time 方法是否保留接收者的 UTC 偏移量或保留时区。如果设置为:zone,则to_time 方法将使用接收者的时区。如果设置为:offset,则to_time 方法将使用 UTC 偏移量。如果为false,则to_time 方法将转换为本地系统 UTC 偏移量。

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

从版本开始 默认值为
(原始) false
5.0 :offset
8.0 :zone

3.15.19 ActiveSupport::Logger.silencer

设置为false 以禁用在块中静默记录的能力。默认值为true

3.15.20 ActiveSupport::Cache::Store.logger

指定要在缓存存储操作中使用的记录器。

3.15.21 ActiveSupport.utc_to_local_returns_utc_offset_times

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

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

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

3.15.22 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.16 配置 Active Job

config.active_job 提供以下配置选项

3.16.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.16.2 config.active_job.default_queue_name

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

config.active_job.default_queue_name = :medium_priority

3.16.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.16.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.16.5 config.active_job.logger

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

3.16.6 config.active_job.custom_serializers

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

3.16.7 config.active_job.log_arguments

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

3.16.8 config.active_job.verbose_enqueue_logs

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

3.16.9 config.active_job.retry_jitter

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

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

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

3.16.10 config.active_job.log_query_tags_around_perform

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

3.17 配置 Action Cable

3.17.1 config.action_cable.url

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

3.17.2 config.action_cable.mount_path

接受作为主服务器进程的一部分安装 Action Cable 的位置的字符串。默认为/cable。您可以将其设置为 nil 以不将 Action Cable 作为正常 Rails 服务器的一部分安装。

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

3.17.3 config.action_cable.precompile_assets

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

3.17.4 config.action_cable.allow_same_origin_as_host

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

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

3.17.5 config.action_cable.allowed_request_origins

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

3.18 配置 Active Storage

config.active_storage 提供以下配置选项

3.18.1 config.active_storage.variant_processor

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

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

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

3.18.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 的持续时间和比特率。

3.18.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.18.4 config.active_storage.paths

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

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

3.18.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.18.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.18.7 config.active_storage.content_types_to_serve_as_binary

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

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

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

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.18.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.18.10 config.active_storage.queues.mirror

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

3.18.11 config.active_storage.queues.preview_image

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

3.18.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.18.13 config.active_storage.queues.transform

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

3.18.14 config.active_storage.logger

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

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

3.18.15 config.active_storage.service_urls_expire_in

确定由以下方法生成的 URL 的默认过期时间

默认值为 5 分钟。

3.18.16 config.active_storage.urls_expire_in

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

3.18.17 config.active_storage.touch_attachment_records

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

3.18.18 config.active_storage.routes_prefix

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

config.active_storage.routes_prefix = "/files"

默认值为 /rails/active_storage

3.18.19 config.active_storage.track_variants

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

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

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

3.18.20 config.active_storage.draw_routes

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

3.18.21 config.active_storage.resolve_model_to_route

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

允许的值为

  • :rails_storage_redirect: 重定向到签名的、短暂的 service URL。
  • :rails_storage_proxy: 通过下载文件来代理文件。

默认值为 :rails_storage_redirect

3.18.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.18.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.18.24 config.active_storage.precompile_assets

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

3.19 配置 Action Text

3.19.1 config.action_text.attachment_tag_name

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

3.19.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 (参见备注) HTML5

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

3.19.3 Regexp.timeout

参见 Ruby 的 Regexp.timeout= 文档。

3.20 配置数据库

几乎每个 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://127.0.0.1/blog_development?pool=5"

config/database.yml 文件包含三个不同环境的节,Rails 默认情况下可以在这些环境中运行

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

如果您愿意,您可以手动在您的 config/database.yml 中指定一个 URL

development:
  url: postgresql://127.0.0.1/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.21 连接偏好

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

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

$ cat config/database.yml

$ echo $DATABASE_URL
postgresql://127.0.0.1/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://127.0.0.1/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://127.0.0.1/my_database">
  ]

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

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

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

$ echo $DATABASE_URL
postgresql://127.0.0.1/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://127.0.0.1/my_database">
  ]

由于池不在 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://127.0.0.1/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.21.1 配置 SQLite3 数据库

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

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

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

Rails 默认使用 SQLite3 数据库进行数据存储,因为它是一个零配置数据库,可以正常运行。Rails 还“开箱即用”地支持 MySQL(包括 MariaDB)和 PostgreSQL,并且拥有许多数据库系统的插件。如果你在生产环境中使用数据库,Rails 很可能有一个适配器可以使用。

3.21.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字符集,请配置你的 MySQL 服务器以通过启用innodb_large_prefix系统变量来支持更长的键前缀。

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

production:
  adapter: mysql2
  advisory_locks: false

3.21.3 配置 PostgreSQL 数据库

如果你选择使用 PostgreSQL,你的config/database.yml 将被自定义以使用 PostgreSQL 数据库。

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

默认情况下,Active Record 使用诸如预备语句和咨询锁之类的数据库功能。如果你使用的是外部连接池(例如 PgBouncer),则可能需要禁用这些功能。

production:
  adapter: postgresql
  prepared_statements: false
  advisory_locks: false

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

production:
  adapter: postgresql
  statement_limit: 200

预备语句使用得越多:你的数据库所需的内存就越多。如果你的 PostgreSQL 数据库遇到了内存限制,请尝试降低statement_limit或禁用预备语句。

3.21.4 为 JRuby 平台配置 SQLite3 数据库

如果你选择使用 SQLite3 并且正在使用 JRuby,那么你的config/database.yml 会略有不同。以下是开发部分

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

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

如果你选择使用 MySQL 或 MariaDB 并且正在使用 JRuby,那么你的config/database.yml 会略有不同。以下是开发部分

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

3.21.6 为 JRuby 平台配置 PostgreSQL 数据库

如果你选择使用 PostgreSQL 并且正在使用 JRuby,那么你的config/database.yml 会略有不同。以下是开发部分

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

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

3.21.7 配置元数据存储

默认情况下,Rails 会将有关你的 Rails 环境和模式的信息存储在名为ar_internal_metadata的内部表中。

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

development:
  adapter: postgresql
  use_metadata_table: false

3.21.8 配置重试行为

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

development:
  adapter: mysql2
  connection_retries: 3

数据库配置还允许配置retry_deadline。如果配置了retry_deadline,则如果查询首次尝试时已超过指定时间,则不会重试其他可重试查询。例如,retry_deadline为 5 秒表示,如果查询首次尝试后已过去 5 秒,则不会重试查询,即使它是幂等的并且还有connection_retries剩余。

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

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

3.21.9 配置查询缓存

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

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

development:
  adapter: mysql2
  query_cache: 200

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

development:
  adapter: mysql2
  query_cache: false

3.22 创建 Rails 环境

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

假设你有一台服务器镜像生产环境,但仅用于测试。这样的服务器通常被称为“staging 服务器”。要为该服务器定义一个名为“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.23 部署到子目录(相对 URL 根目录)

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

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

config.relative_url_root = "/app1"

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

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

3.23.1 使用 Passenger

Passenger 使在子目录中运行应用程序变得容易。你可以在Passenger 手册中找到相关配置。

3.23.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 将运行的环境(production、development、test 等)。

  • ENV["RAILS_RELATIVE_URL_ROOT"]由路由代码用于在将你的应用程序部署到子目录时识别 URL。

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

5 使用初始化器文件

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

config/initializers(及其任何子目录)中的文件按顺序逐个加载,作为load_config_initializers初始化器的一部分。

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

无法保证你的初始化器会在所有 gem 初始化器之后运行,因此任何依赖于特定 gem 已完成初始化的初始化代码都应该放在config.after_initialize块中。

6 加载钩子

Rails 代码通常可以在应用程序加载时被引用。Rails 负责这些框架的加载顺序,因此当你过早地加载框架(例如ActiveRecord::Base)时,你是在违反应用程序与 Rails 之间的隐式契约。此外,通过在应用程序启动时加载诸如ActiveRecord::Base之类的代码,你是在加载整个框架,这会减慢启动速度,并可能导致加载顺序和应用程序启动方面的冲突。

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

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 修改代码以使用加载钩子

修改代码通常很简单。如果您有一行代码引用 Rails 框架,例如 ActiveRecord::Base,您可以在加载钩子中封装该代码。

修改对 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::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::Railtie 中的 initializer 方法定义的。以下是如何从 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 个名为 "one" 到 "four" 的初始化程序(按此顺序定义),并且您将 "four" 定义为 "two" 之前 "three" 之后,这只是不合逻辑的,Rails 将无法确定您的初始化程序顺序。

initializer 方法的块参数是应用程序本身的实例,因此我们可以通过使用示例中使用的 config 方法访问它的配置。

因为 Rails::ApplicationRails::Railtie(间接地)继承,所以您可以在 config/application.rb 中使用 initializer 方法来为应用程序定义初始化程序。

7.2 初始化程序

以下是按定义顺序(因此按运行顺序,除非另有说明)找到的所有 Rails 初始化程序的完整列表。

  • load_environment_hook: 用作占位符,以便 :load_environment_config 可以定义为在其之前运行。

  • load_active_support: 需要 active_support/dependencies,它设置了 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.deprecatorsconfig.active_support.report_deprecationsconfig.active_support.deprecationconfig.active_support.disallowed_deprecationconfig.active_support.disallowed_deprecation_warnings 设置 Rails.application.deprecators 的弃用报告行为。

  • active_support.initialize_time_zone: 根据 config.time_zone 设置(默认为 "UTC")设置应用程序的默认时区。

  • active_support.initialize_beginning_of_week: 根据 config.beginning_of_week 设置(默认为 :monday)设置应用程序的默认一周开始日期。

  • active_support.set_configs: 通过将方法名作为设置器发送到 ActiveSupport 并传递值来使用 config.active_support 中的设置来设置 Active Support。

  • action_dispatch.configure: 将 ActionDispatch::Http::URL.tld_length 配置为设置为 config.action_dispatch.tld_length 的值。

  • action_view.set_configs: 通过将方法名作为设置器发送到 ActionView::Base 并传递值来使用 config.action_view 中的设置来设置 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: 通过将方法名作为设置器发送到 ActionController::Base 并传递值来使用 config.action_controller 中的设置来设置 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: 如果已配置且可用,则加载架构缓存转储。

  • active_record.set_configs: 通过将方法名作为设置器发送到 ActiveRecord::Base 并传递值来使用 config.active_record 中的设置来设置 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: 通过将方法名作为设置器发送到 ActiveJob::Base 并传递值来使用 config.active_job 中的设置来设置 Active Job。

  • action_mailer.logger: 如果尚未设置 ActionMailer::Base.logger,则将其设置为 Rails.logger

  • action_mailer.set_configs: 通过将方法名作为设置器发送到 ActionMailer::Base 并传递值来使用 config.action_mailer 中的设置来设置 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 和 Ruby 版本的详细信息,以供默认 Rails 应用程序中的 public/index.html 使用。

  • 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: 使用 ActiveSupport::Callbacks.to_run 配置 Action Dispatch 以重新加载路由文件。

  • 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: /

要仅阻止特定页面,需要使用更复杂的语法。在 官方文档 中了解它。



返回顶部