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 的默认值
Regexp.timeout
:1
config.action_dispatch.strict_freshness
:true
config.active_support.to_time_preserves_timezone
::zone
3.1.2 目标版本 7.2 的默认值
config.active_record.postgresql_adapter_decode_dates
:true
config.active_record.validate_migration_timestamps
:true
config.active_storage.web_image_content_types
:%w[image/png image/jpeg image/gif image/webp]
config.yjit
:true
3.1.3 目标版本 7.1 的默认值
config.action_dispatch.debug_exception_log_level
::error
config.action_dispatch.default_headers
:{ "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" }
config.action_text.sanitizer_vendor
:Rails::HTML::Sanitizer.best_supported_vendor
config.action_view.sanitizer_vendor
:Rails::HTML::Sanitizer.best_supported_vendor
config.active_record.before_committed_on_all_records
:true
config.active_record.belongs_to_required_validates_foreign_key
:false
config.active_record.default_column_serializer
:nil
config.active_record.encryption.hash_digest_class
:OpenSSL::Digest::SHA256
config.active_record.encryption.support_sha1_for_non_deterministic_encryption
:false
config.active_record.generate_secure_token_on
::initialize
config.active_record.marshalling_format_version
:7.1
config.active_record.query_log_tags_format
::sqlcommenter
config.active_record.raise_on_assign_to_attr_readonly
:true
config.active_record.run_after_transaction_callbacks_in_order_defined
:true
config.active_record.run_commit_callbacks_on_first_saved_instances_in_transaction
:false
config.active_record.sqlite3_adapter_strict_strings_by_default
:true
config.active_support.cache_format_version
:7.1
config.active_support.message_serializer
::json_allow_marshal
config.active_support.raise_on_invalid_cache_expiration_time
:true
config.active_support.use_message_serializer_for_metadata
:true
config.add_autoload_paths_to_load_path
:false
config.dom_testing_default_html_version
:defined?(Nokogiri::HTML5) ? :html5 : :html4
config.log_file_size
:100 * 1024 * 1024
config.precompile_filter_parameters
:true
3.1.4 目标版本 7.0 的默认值
config.action_controller.raise_on_open_redirects
:true
config.action_controller.wrap_parameters_by_default
:true
config.action_dispatch.cookies_serializer
::json
config.action_dispatch.default_headers
:{ "X-Frame-Options" => "SAMEORIGIN", "X-XSS-Protection" => "0", "X-Content-Type-Options" => "nosniff", "X-Download-Options" => "noopen", "X-Permitted-Cross-Domain-Policies" => "none", "Referrer-Policy" => "strict-origin-when-cross-origin" }
config.action_mailer.smtp_timeout
:5
config.action_view.apply_stylesheet_media_default
:false
config.action_view.button_to_generates_button_tag
:true
config.active_record.automatic_scope_inversing
:true
config.active_record.partial_inserts
:false
config.active_record.verify_foreign_keys_for_fixtures
:true
config.active_storage.multiple_file_field_include_hidden
:true
config.active_storage.variant_processor
::vips
config.active_storage.video_preview_arguments
:"-vf 'select=eq(n\\,0)+eq(key\\,1)+gt(scene\\,0.015),loop=loop=-1:size=2,trim=start_frame=1' -frames:v 1 -f image2"
config.active_support.cache_format_version
:7.0
config.active_support.executor_around_test_case
:true
config.active_support.hash_digest_class
:OpenSSL::Digest::SHA256
config.active_support.key_generator_hash_digest_class
:OpenSSL::Digest::SHA256
3.1.5 针对目标版本 6.1 的默认值
ActiveSupport.utc_to_local_returns_utc_offset_times
:true
config.action_dispatch.cookies_same_site_protection
::lax
config.action_dispatch.ssl_default_redirect_status
:308
config.action_mailbox.queues.incineration
:nil
config.action_mailbox.queues.routing
:nil
config.action_mailer.deliver_later_queue_name
:nil
config.action_view.form_with_generates_remote_forms
:false
config.action_view.preload_links_header
:true
config.active_job.retry_jitter
:0.15
config.active_record.has_many_inversing
:true
config.active_storage.queues.analysis
:nil
config.active_storage.queues.purge
:nil
config.active_storage.track_variants
:true
3.1.6 针对目标版本 6.0 的默认值
config.action_dispatch.use_cookies_with_metadata
:true
config.action_mailer.delivery_job
:"ActionMailer::MailDeliveryJob"
config.action_view.default_enforce_utf8
:false
config.active_record.collection_cache_versioning
:true
config.active_storage.queues.analysis
::active_storage_analysis
config.active_storage.queues.purge
::active_storage_purge
3.1.7 针对目标版本 5.2 的默认值
config.action_controller.default_protect_from_forgery
:true
config.action_dispatch.use_authenticated_cookie_encryption
:true
config.action_view.form_with_generates_ids
:true
config.active_record.cache_versioning
:true
config.active_support.hash_digest_class
:OpenSSL::Digest::SHA1
config.active_support.use_authenticated_message_encryption
:true
3.1.8 针对目标版本 5.1 的默认值
config.action_view.form_with_generates_remote_forms
:true
config.assets.unknown_asset_fallback
:false
3.1.9 针对目标版本 5.0 的默认值
config.action_controller.forgery_protection_origin_check
:true
config.action_controller.per_form_csrf_tokens
:true
config.active_record.belongs_to_required_by_default
:true
config.active_support.to_time_preserves_timezone
::offset
config.ssl_options
:{ hsts: { subdomains: true } }
3.2 Rails 通用配置
以下配置方法需要在 Rails::Railtie
对象上调用,例如 Rails::Engine
或 Rails::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_paths
和 config.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.rb
或config/environments/#{Rails.env}.rb
中设置。
3.2.22 config.credentials.key_path
加密凭据密钥文件的路径。
默认情况下,如果存在,则为config/credentials/#{Rails.env}.key
,否则为config/master.key
。
为了使bin/rails credentials
命令识别此值,它必须在config/application.rb
或config/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
错误,这些错误是在客户端发送无效的 Accept
或 Content-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_change
为 true
时,用于检测文件系统中文件更新的类。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.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_reloading
为 false
,则此选项将被忽略。
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
,它们分别需要使用terser
、closure-compiler
、uglifier
或yui-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.css
和application.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
支持Regexp
、Proc
和IPAddr
类型的条目,仅举几例。下面是一个使用正则表达式的示例。
# 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.enabled
为false
,则禁用。如果您需要提供一个未命名为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_concurrency
为false
,则禁用,这会导致加载Rack::Lock
。Rack::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_check
和config.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_to
到 has_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_commit
或 after_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
如果未为给定列显式指定序列化器实现,则要使用的序列化器实现。
历史上 serialize
和 store
虽然允许使用替代的序列化器实现,但默认情况下会使用 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_threads
和 min_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
、:deprecated
或 true
,分别表示引发错误、发出弃用警告或不执行任何操作。
从版本开始 | 默认值为 |
---|---|
(原始) | 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_booleans
和 ActiveRecord::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
。
您可以通过将此设置为对 deflate
和 inflate
响应的类来使用自己的压缩器。
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
方法在任何地方都可用。默认配置行为(当此选项未明确设置为 true
或 false
时)是所有视图助手对每个控制器都可用。
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
的目标版本
从版本开始 | 默认值为 |
---|---|
(原始) |
|
7.0 |
|
7.1 |
|
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'
。
3.10.9 config.action_dispatch.signed_cookie_salt
设置签名 cookie 的盐值。默认为 'signed cookie'
。
3.10.10 config.action_dispatch.encrypted_cookie_salt
设置加密 cookie 的盐值。默认为 'encrypted cookie'
。
3.10.11 config.action_dispatch.encrypted_signed_cookie_salt
设置签名加密 cookie 的盐值。默认为 'signed encrypted cookie'
。
3.10.12 config.action_dispatch.authenticated_encrypted_cookie_salt
设置经过身份验证的加密 cookie 的盐值。默认为 'authenticated encrypted cookie'
。
3.10.13 config.action_dispatch.encrypted_cookie_cipher
设置用于加密 cookie 的密码。默认为 "aes-256-gcm"
。
3.10.14 config.action_dispatch.signed_cookie_digest
设置用于签名 cookie 的摘要算法。默认为 "SHA1"
。
3.10.15 config.action_dispatch.cookies_rotations
允许旋转加密和签名 cookie 的密钥、密码和摘要算法。
3.10.16 config.action_dispatch.use_authenticated_cookie_encryption
控制签名和加密 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 引发所有异常。
:all
- 为所有异常渲染错误页面:rescuable
- 为config.action_dispatch.rescue_responses
声明的异常渲染错误页面:none
- 引发所有异常
从版本开始 | 默认值为 |
---|---|
(原始) | true |
7.1 | :all |
3.11 config.action_dispatch.strict_freshness
配置 ActionDispatch::ETag
中间件在响应中同时存在 ETag
和 Last-Modified
头信息时是否应该优先使用 ETag
头信息。
如果设置为 true
,则当两个头信息都存在时,只考虑 ETag
,如 RFC 7232 第 6 节所指定。
如果设置为 false
,则当两个头信息都存在时,会检查两个头信息,并且两个头信息都需要匹配,才能将响应视为新鲜的。
从版本开始 | 默认值为 |
---|---|
(原始) | false |
8.0 | true |
3.11.1 config.action_dispatch.always_write_cookie
如果 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
。
3.12.17 config.action_view.preload_links_header
确定 javascript_include_tag
和 stylesheet_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_tag
和 button_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_NONE
或OpenSSL::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 默认值。用于为每个邮件程序设置 from
或 reply_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::MessageEncryptor
和 ActiveSupport::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
序列化器支持对某些 Ruby 类型进行往返转换,而这些类型不受 JSON 支持,例如 Symbol
。它们还可以提供更好的性能和更小的有效负载大小。但是,它们需要 msgpack
gem。
上述每个序列化器在回退到备用反序列化格式时都会发出 message_serializer_fallback.active_support
事件通知,允许您跟踪此类回退发生的频率。
或者,您可以指定任何响应 dump
和 load
方法的序列化器对象。例如
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.0
和 7.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
fetch
或 write
被赋予无效的expires_at
或 expires_in
时间,是否应该引发ArgumentError
。
选项为true
和 false
。如果为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]
PopplerPDFPreviewer
和 MuPDFPreviewer
可以从 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 的默认过期时间
ActiveStorage::Blob#url
ActiveStorage::Blob#service_url_for_direct_upload
ActiveStorage::Preview#url
ActiveStorage::Variant#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"
|
3.18.23 config.active_storage.multiple_file_field_include_hidden
在 Rails 7.1 及更高版本中,Active Storage has_many_attached
关系将默认设置为替换当前集合,而不是追加到当前集合。因此,为了支持提交空集合,当 multiple_file_field_include_hidden
为 true
时,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.yml
和 ENV['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
中的每次代码重新加载时运行,但仅在production
和test
中运行一次(在启动时)。before_eager_load
: 这是在急切加载发生之前直接运行的,这是production
环境的默认行为,而不是development
环境的默认行为。after_initialize
: 在应用程序初始化之后直接运行,在config/initializers
中的应用程序初始化程序运行之后运行。
要为这些钩子定义一个事件,请在 Rails::Application
、Rails::Railtie
或 Rails::Engine
子类中使用块语法。
module YourApp
class Application < Rails::Application
config.before_initialize do
# initialization code goes here
end
end
end
或者,您也可以通过 Rails.application
对象上的 config
方法来实现。
Rails.application.config.before_initialize do
# initialization code goes here
end
您应用程序的某些部分,特别是路由,在调用 after_initialize
块时尚未设置。
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::Application
从 Rails::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.deprecators
、config.active_support.report_deprecations
、config.active_support.deprecation
、config.active_support.disallowed_deprecation
和config.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::ControllerRuntime
和ActiveRecord::Railties::JobRuntime
,它们负责将 Active Record 调用在请求中花费的时间报告回日志记录器。active_record.set_reloader_hooks
: 如果config.enable_reloading
设置为true
,则将所有可重新加载的数据库连接重置。active_record.add_watchable_files
: 将schema.rb
和structure.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_paths
、config.eager_load_paths
、config.autoload_once_paths
指定的所有自动加载路径。set_autoload_paths
: 此初始化器在bootstrap_hook
之前运行。将app
的所有子目录以及config.autoload_paths
、config.eager_load_paths
和config.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_load
为true
,则运行config.before_eager_load
钩子,然后调用eager_load!
,这将加载所有config.eager_load_namespaces
。finisher_hook
: 提供一个钩子,用于在应用程序初始化过程完成后,以及运行应用程序、railties 和引擎的所有config.after_initialize
代码块。set_routes_reloader_hook
: 使用ActiveSupport::Callbacks.to_run
配置 Action Dispatch 以重新加载路由文件。disable_dependency_loading
: 如果config.eager_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: /
要仅阻止特定页面,需要使用更复杂的语法。在 官方文档 中了解它。