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 将加载包括版本 6.1 在内的所有版本的默认值。
以下是每个目标版本关联的默认值。在值冲突的情况下,新版本优先于旧版本。
3.1.1. 目标版本 8.1 的默认值
config.action_controller.action_on_path_relative_redirect::raiseconfig.action_controller.escape_json_responses:falseconfig.action_view.remove_hidden_field_autocomplete:trueconfig.action_view.render_tracker::rubyconfig.active_record.raise_on_missing_required_finder_order_columns:trueconfig.active_support.escape_js_separators_in_json:falseconfig.yjit:!Rails.env.local?
3.1.2. 目标版本 8.0 的默认值
3.1.3. 目标版本 7.2 的默认值
config.active_record.postgresql_adapter_decode_dates:trueconfig.active_record.validate_migration_timestamps:trueconfig.active_storage.web_image_content_types:%w( image/png image/jpeg image/gif image/webp )config.yjit:true
3.1.4. 目标版本 7.1 的默认值
config.action_dispatch.debug_exception_log_level::errorconfig.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_vendorconfig.action_view.sanitizer_vendor:Rails::HTML::Sanitizer.best_supported_vendorconfig.active_record.before_committed_on_all_records:trueconfig.active_record.belongs_to_required_validates_foreign_key:falseconfig.active_record.default_column_serializer:nilconfig.active_record.encryption.hash_digest_class:OpenSSL::Digest::SHA256config.active_record.encryption.support_sha1_for_non_deterministic_encryption:falseconfig.active_record.generate_secure_token_on::initializeconfig.active_record.marshalling_format_version:7.1config.active_record.query_log_tags_format::sqlcommenterconfig.active_record.raise_on_assign_to_attr_readonly:trueconfig.active_record.run_after_transaction_callbacks_in_order_defined:trueconfig.active_record.run_commit_callbacks_on_first_saved_instances_in_transaction:falseconfig.active_record.sqlite3_adapter_strict_strings_by_default:trueconfig.active_support.cache_format_version:7.1config.active_support.message_serializer::json_allow_marshalconfig.active_support.raise_on_invalid_cache_expiration_time:trueconfig.active_support.use_message_serializer_for_metadata:trueconfig.add_autoload_paths_to_load_path:falseconfig.dom_testing_default_html_version:defined?(Nokogiri::HTML5) ? :html5 : :html4config.log_file_size:100 * 1024 * 1024config.precompile_filter_parameters:true
3.1.5. 目标版本 7.0 的默认值
config.action_controller.action_on_open_redirect::raiseconfig.action_controller.wrap_parameters_by_default:trueconfig.action_dispatch.cookies_serializer::jsonconfig.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:5config.action_view.apply_stylesheet_media_default:falseconfig.action_view.button_to_generates_button_tag:trueconfig.active_record.automatic_scope_inversing:trueconfig.active_record.partial_inserts:falseconfig.active_record.verify_foreign_keys_for_fixtures:trueconfig.active_storage.multiple_file_field_include_hidden:trueconfig.active_storage.variant_processor::vipsconfig.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.0config.active_support.executor_around_test_case:trueconfig.active_support.hash_digest_class:OpenSSL::Digest::SHA256config.active_support.key_generator_hash_digest_class:OpenSSL::Digest::SHA256
3.1.6. 目标版本 6.1 的默认值
ActiveSupport.utc_to_local_returns_utc_offset_times:trueconfig.action_dispatch.cookies_same_site_protection::laxconfig.action_dispatch.ssl_default_redirect_status:308config.action_mailbox.queues.incineration:nilconfig.action_mailbox.queues.routing:nilconfig.action_mailer.deliver_later_queue_name:nilconfig.action_view.form_with_generates_remote_forms:falseconfig.action_view.preload_links_header:trueconfig.active_job.retry_jitter:0.15config.active_record.has_many_inversing:trueconfig.active_storage.queues.analysis:nilconfig.active_storage.queues.purge:nilconfig.active_storage.track_variants:true
3.1.7. 目标版本 6.0 的默认值
config.action_dispatch.use_cookies_with_metadata:trueconfig.action_mailer.delivery_job:"ActionMailer::MailDeliveryJob"config.action_view.default_enforce_utf8:falseconfig.active_record.collection_cache_versioning:trueconfig.active_storage.queues.analysis::active_storage_analysisconfig.active_storage.queues.purge::active_storage_purge
3.1.8. 目标版本 5.2 的默认值
config.action_controller.default_protect_from_forgery:trueconfig.action_dispatch.use_authenticated_cookie_encryption:trueconfig.action_view.form_with_generates_ids:trueconfig.active_record.cache_versioning:trueconfig.active_support.hash_digest_class:OpenSSL::Digest::SHA1config.active_support.use_authenticated_message_encryption:true
3.1.9. 目标版本 5.1 的默认值
config.action_view.form_with_generates_remote_forms:trueconfig.assets.unknown_asset_fallback:false
3.1.10. 目标版本 5.0 的默认值
config.action_controller.forgery_protection_origin_check:trueconfig.action_controller.per_form_csrf_tokens:trueconfig.active_record.belongs_to_required_by_default:trueconfig.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。建议在 config/application.rb 中的 :zeitwerk 模式下尽早将其设置为 false。Zeitwerk 在内部使用绝对路径,并且在 :zeitwerk 模式下运行的应用程序不需要 require_dependency,因此模型、控制器、作业等不需要在 $LOAD_PATH 中。将其设置为 false 可以使 Ruby 在使用相对路径解析 require 调用时避免检查这些目录,并节省 Bootsnap 的工作和 RAM,因为它不需要为它们构建索引。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | true |
| 7.1 | false |
lib 目录不受此标志的影响,它始终添加到 $LOAD_PATH 中。
3.2.2. config.after_initialize
接受一个块,该块将在 Rails 完成应用程序初始化后运行。这包括框架本身的初始化、引擎以及 config/initializers 中所有应用程序的初始化器。请注意,此块将为 rake 任务运行。对于配置其他初始化器设置的值很有用
config.after_initialize do
ActionView::Base.sanitized_allowed_tags.delete "div"
end
3.2.3. config.after_routes_loaded
接受一个块,该块将在 Rails 完成加载应用程序路由后运行。此块也将在路由重新加载时运行。
config.after_routes_loaded do
# Code that does something with Rails.application.routes
end
3.2.4. config.allow_concurrency
控制请求是否应并发处理。仅当应用程序代码不是线程安全的时才应将其设置为 false。默认为 true。
3.2.5. config.asset_host
设置资产的主机。当 CDN 用于托管资产,或者当您希望通过使用不同的域别名来绕过浏览器内置的并发限制时,此功能很有用。是 config.action_controller.asset_host 的较短版本。
3.2.6. config.assume_ssl
使应用程序认为所有请求都通过 SSL 到达。当通过终止 SSL 的负载均衡器代理时,转发的请求将显示为 HTTP 而不是 HTTPS 到应用程序。这会使重定向和 cookie 安全性目标为 HTTP 而不是 HTTPS。此中间件使服务器假设代理已经终止 SSL,并且请求确实是 HTTPS。
3.2.7. config.autoflush_log
启用立即写入日志文件输出而不是缓冲。默认为 true。
3.2.8. config.autoload_lib(ignore:)
此方法将 lib 添加到 config.autoload_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_auto
请参阅安全指南中的添加 Nonce
3.2.19. config.content_security_policy_nonce_directives
请参阅安全指南中的添加 Nonce
3.2.20. config.content_security_policy_nonce_generator
请参阅安全指南中的添加 Nonce
3.2.21. config.content_security_policy_report_only
请参阅安全指南中的报告违规
3.2.22. config.credentials.content_path
加密凭据文件的路径。
如果 config/credentials/#{Rails.env}.yml.enc 存在,则默认为该路径,否则为 config/credentials.yml.enc。
为了让 bin/rails credentials 命令识别此值,必须在 config/application.rb 或 config/environments/#{Rails.env}.rb 中设置。
3.2.23. 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.24. config.debug_exception_response_format
设置开发环境中发生错误时响应中使用的格式。对于纯 API 应用程序默认为 :api,对于普通应用程序默认为 :default。
3.2.25. config.disable_sandbox
控制是否有人可以以沙盒模式启动控制台。这有助于避免长时间运行的沙盒控制台会话,这可能导致数据库服务器内存不足。默认为 false。
3.2.26. config.dom_testing_default_html_version
控制 Action View、Action Dispatch 和 rails-dom-testing 中的测试助手默认使用 HTML4 解析器还是 HTML5 解析器。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | :html4 |
| 7.1 | :html5 (参见注意) |
Nokogiri 的 HTML5 解析器不支持 JRuby,因此在 JRuby 平台上,Rails 将回退到 :html4。
3.2.27. config.eager_load
当为 true 时,急切加载所有注册的 config.eager_load_namespaces。这包括您的应用程序、引擎、Rails 框架和任何其他注册的命名空间。
3.2.28. config.eager_load_namespaces
注册当 config.eager_load 设置为 true 时急切加载的命名空间。列表中的所有命名空间必须响应 eager_load! 方法。
3.2.29. config.eager_load_paths
接受一个路径数组,如果 config.eager_load 为 true,Rails 将在启动时急切加载这些路径。默认为应用程序 app 目录中的每个文件夹。
3.2.30. config.enable_reloading
如果 config.enable_reloading 为 true,则应用程序类和模块在 Web 请求之间更改时会重新加载。在 development 环境中默认为 true,在 production 环境中为 false。
谓词 config.reloading_enabled? 也已定义。
3.2.31. config.encoding
设置应用程序范围的编码。默认为 UTF-8。
3.2.32. config.exceptions_app
设置当发生异常时由 ShowException 中间件调用的异常应用程序。默认为 ActionDispatch::PublicExceptions.new(Rails.public_path)。
3.2.33. config.file_watcher
是当 config.reload_classes_only_on_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.34. config.filter_parameters
用于过滤掉您不想在日志中显示的参数,例如密码或信用卡号。它还会过滤掉调用 Active Record 对象的 #inspect 时数据库列的敏感值。默认情况下,Rails 通过在 config/initializers/filter_parameter_logging.rb 中添加以下过滤器来过滤密码。
Rails.application.config.filter_parameters += [
:passw, :email, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn, :cvv, :cvc
]
参数过滤器通过部分匹配正则表达式工作。
3.2.35. config.filter_redirect
用于从应用程序日志中过滤掉重定向 URL。
Rails.application.config.filter_redirect += ["s3.amazonaws.com", /private-match/]
重定向过滤器通过测试 URL 是否包含字符串或匹配正则表达式来工作。
3.2.36. config.force_ssl
强制所有请求通过 HTTPS 提供,并将 "https://" 设置为生成 URL 时的默认协议。HTTPS 的强制执行由 ActionDispatch::SSL 中间件处理,可以通过 config.ssl_options 进行配置。
3.2.37. config.helpers_paths
定义用于加载视图助手的额外路径数组。
3.2.38. config.host_authorization
接受一个哈希选项来配置 HostAuthorization 中间件
3.2.39. config.hosts
一个字符串、正则表达式或 IPAddr 数组,用于验证 Host 头。由 HostAuthorization 中间件 使用,以帮助防止 DNS 重绑定攻击。
3.2.40. config.javascript_path
设置您的应用程序 JavaScript 相对于 app 目录的路径,默认值为 javascript。应用程序配置的 javascript_path 将从 autoload_paths 中排除。
3.2.41. config.log_file_size
定义 Rails 日志文件的最大大小(以字节为单位)。在开发和测试环境中默认为 104_857_600 (100 MiB),在所有其他环境中无限制。
3.2.42. config.log_formatter
定义 Rails 记录器的格式化程序。此选项在所有环境中默认为 ActiveSupport::Logger::SimpleFormatter 的实例。如果您为 config.logger 设置了值,则必须在将记录器包装在 ActiveSupport::TaggedLogging 实例中之前手动将格式化程序的值传递给记录器,Rails 不会为您执行此操作。
3.2.43. config.log_level
定义 Rails 记录器的详细程度。此选项在生产环境之外的所有环境中默认为 :debug,在生产环境中默认为 :info。可用的日志级别有::debug、:info、:warn、:error、:fatal 和 :unknown。
3.2.44. config.log_tags
接受 request 对象响应的方法列表、接受 request 对象的 Proc 或响应 to_s 的内容。这使得用子域和请求 ID 等调试信息标记日志行变得容易——这在调试多用户生产应用程序中都非常有用。
3.2.45. config.logger
是将用于 Rails.logger 和任何相关 Rails 日志记录(例如 ActiveRecord::Base.logger)的记录器。它默认为 ActiveSupport::TaggedLogging 的一个实例,该实例包装了 ActiveSupport::Logger 的一个实例,该实例将日志输出到 log/ 目录。您可以提供自定义记录器,为了获得完全兼容性,您必须遵循以下准则
- 要支持格式化程序,您必须手动将
config.log_formatter值中的格式化程序分配给记录器。 - 要支持带标签的日志,日志实例必须用
ActiveSupport::TaggedLogging包装。 - 要支持静默,记录器必须包含
ActiveSupport::LoggerSilence模块。ActiveSupport::Logger类已经包含这些模块。
class MyLogger < ::Logger
include ActiveSupport::LoggerSilence
end
mylogger = MyLogger.new(STDOUT)
mylogger.formatter = config.log_formatter
config.logger = ActiveSupport::TaggedLogging.new(mylogger)
3.2.46. config.middleware
允许您配置应用程序的中间件。这将在下面的配置中间件部分中详细介绍。
3.2.47. config.precompile_filter_parameters
当为 true 时,将使用 ActiveSupport::ParameterFilter.precompile_filters 预编译 config.filter_parameters。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | false |
| 7.1 | true |
3.2.48. config.public_file_server.enabled
配置 Rails 是否应从公共目录提供静态文件。默认为 true。
如果服务器软件(例如 NGINX 或 Apache)应提供静态文件,请将此值设置为 false。
3.2.49. config.railties_order
允许手动指定 Railties/Engines 的加载顺序。默认值为 [:all]。
config.railties_order = [Blog::Engine, :main_app, :all]
3.2.50. config.rake_eager_load
当为 true 时,运行 Rake 任务时急切加载应用程序。默认为 false。
3.2.51. config.relative_url_root
可用于告诉 Rails 您正在部署到子目录。默认值为 ENV['RAILS_RELATIVE_URL_ROOT']。
3.2.52. config.reload_classes_only_on_change
启用或禁用仅当跟踪文件更改时才重新加载类。默认情况下,跟踪自动加载路径上的所有内容并设置为 true。如果 config.enable_reloading 为 false,则此选项将被忽略。
3.2.53. config.require_master_key
如果未通过 ENV["RAILS_MASTER_KEY"] 或 config/master.key 文件提供主密钥,则应用程序将无法启动。
3.2.54. config.sandbox_by_default
当为 true 时,rails console 以沙盒模式启动。要以非沙盒模式启动 rails console,必须指定 --no-sandbox。这有助于避免意外写入生产数据库。默认为 false。
3.2.55. config.secret_key_base
用于指定应用程序密钥生成器的输入秘密的备用。建议将其保留未设置,而是在 config/credentials.yml.enc 中指定 secret_key_base。有关更多信息和替代配置方法,请参阅 secret_key_base API 文档。
3.2.56. config.server_timing
当为 true 时,将 ServerTiming 中间件 添加到中间件堆栈中。默认为 false,但在默认生成的 config/environments/development.rb 文件中设置为 true。
3.2.57. config.session_options
传递给 config.session_store 的其他选项。您应该使用 config.session_store 来设置它,而不是自己修改它。
config.session_store :cookie_store, key: "_your_app_session"
config.session_options # => {key: "_your_app_session"}
3.2.58. config.session_store
指定用于存储会话的类。可能的值有 :cache_store、:cookie_store、:mem_cache_store、自定义存储或 :disabled。:disabled 告诉 Rails 不处理会话。
此设置通过常规方法调用而不是 setter 进行配置。这允许传递其他选项
config.session_store :cookie_store, key: "_your_app_session"
如果自定义存储指定为符号,它将在 ActionDispatch::Session 命名空间中解析
# use ActionDispatch::Session::MyCustomStore as the session store
config.session_store :my_custom_store
默认存储是一个 cookie 存储,以应用程序名称作为会话密钥。
3.2.59. config.silence_healthcheck_path
指定应在日志中静默的健康检查路径。使用 Rails::Rack::SilenceRequest 实现静默。所有这些都是为了防止健康检查堵塞生产日志,特别是对于早期应用程序。
config.silence_healthcheck_path = "/up"
3.2.60. config.ssl_options
ActionDispatch::SSL 中间件的配置选项。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | {} |
| 5.0 | { hsts: { subdomains: true } } |
3.2.61. config.time_zone
设置应用程序的默认时区并为 Active Record 启用时区感知。
3.2.62. config.x
用于轻松地向应用程序配置对象添加嵌套的自定义配置
config.x.payment_processing.schedule = :daily
Rails.configuration.x.payment_processing.schedule # => :daily
请参阅自定义配置
3.2.63. config.yjit
从 Ruby 3.3 开始启用 YJIT,以带来显着的性能提升。如果您部署到内存受限的环境,您可能需要将其设置为 false。此外,您可以传递一个哈希来配置 YJIT 选项,例如 { stats: true }。
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | false |
| 7.2 | true |
| 8.1 | !Rails.env.local? |
3.3. 配置资产
3.3.1. config.assets.css_compressor
定义要使用的 CSS 压缩器。默认由 sass-rails 设置。目前唯一的替代值是 :yui,它使用 yui-compressor gem。
3.3.2. config.assets.js_compressor
定义要使用的 JavaScript 压缩器。可能的值有 :terser、:closure、:uglifier 和 :yui,它们分别需要使用 terser、closure-compiler、uglifier 或 yui-compressor gem。
3.3.3. config.assets.gzip
一个标志,启用创建已编译资产的 gzipped 版本以及非 gzipped 资产。默认为 true。
3.3.4. config.assets.paths
包含用于查找资产的路径。将路径附加到此配置选项将导致这些路径用于搜索资产。
3.3.5. config.assets.precompile
允许您指定在运行 bin/rails assets:precompile 时要预编译的其他资产(除了 application.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
定义用于资产预编译器的清单文件的完整路径。默认为公共文件夹内 config.assets.prefix 目录中的一个名为 manifest-<random>.json 的文件。
3.3.9. config.assets.digest
启用在资产名称中使用 SHA256 指纹。默认为 true。
3.3.10. config.assets.debug
禁用资产的连接和压缩。
3.3.11. config.assets.version
是用于 SHA256 哈希生成的可选字符串。可以更改此项以强制重新编译所有文件。
3.3.12. config.assets.compile
是一个布尔值,可用于在生产环境中开启实时 Sprockets 编译。
3.3.13. config.assets.logger
接受符合 Log4r 接口或默认 Ruby Logger 类的记录器。默认为 config.logger 中配置的相同。将 config.assets.logger 设置为 false 将关闭服务资产的日志记录。
3.3.14. config.assets.quiet
禁用资产请求的日志记录。在 config/environments/development.rb 中默认为 true。
3.4. 配置生成器
Rails 允许您使用 config.generators 方法更改所使用的生成器。此方法接受一个块
config.generators do |g|
g.orm :active_record
g.test_framework :test_unit
end
此块中可以使用的完整方法集如下
force_plural允许复数模型名称。默认为false。helper定义是否生成助手。默认为true。integration_tool定义用于生成集成测试的集成工具。默认为:test_unit。system_tests定义用于生成系统测试的集成工具。默认为:test_unit。orm定义要使用的 ORM。默认为false,默认将使用 Active Record。resource_controller定义使用bin/rails generate resource时用于生成控制器的生成器。默认为:controller。resource_route定义是否应生成资源路由定义。默认为true。scaffold_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"
请求的主机使用 case 运算符 (#===) 与 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 the domain itself `product.com` and subdomains like `www.product.com` and `beta1.product.com`.
Rails.application.config.hosts << ".product.com"
您可以通过设置 config.host_authorization.exclude 将某些请求从主机授权检查中排除
# Exclude requests for the /healthcheck/ path from host checking
Rails.application.config.host_authorization = {
exclude: ->(request) { request.path.include?("healthcheck") }
}
当请求到达未经授权的主机时,将运行默认的 Rack 应用程序并响应 403 Forbidden。这可以通过设置 config.host_authorization.response_app 进行自定义。例如
Rails.application.config.host_authorization = {
response_app: -> env do
[400, { "Content-Type" => "text/plain" }, ["Bad Request"]]
end
}
3.5.2. ActionDispatch::ServerTiming
将 Server-Timing 头添加到响应中,其中包含来自服务器的性能指标。可以通过浏览器开发者工具的网络面板检查响应来查看这些数据。大多数浏览器提供一个“计时”选项卡,可将数据显示可视化。
3.5.3. ActionDispatch::SSL
强制每个请求都使用 HTTPS 提供。如果 config.force_ssl 设置为 true,则启用。传递给它的选项可以通过设置 config.ssl_options 进行配置。
3.5.4. ActionDispatch::Static
用于提供静态资产。如果 config.public_file_server.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]或者您可以为每个语言环境单独设置不同的回退。例如,如果您想将
:tr用于:az,将:de、:en用于:da作为回退,您可以这样做config.i18n.fallbacks = { az: :tr, da: [:de, :en] } #or config.i18n.fallbacks.map = { az: :tr, da: [:de, :en] }
3.7. 配置 Active Model
3.7.1. config.active_model.i18n_customize_full_message
控制 Error#full_message 格式是否可以在 i18n 语言环境文件中被覆盖。默认为 false。
当设置为 true 时,full_message 将在语言环境文件的属性和模型级别查找格式。默认格式为 "%{attribute} %{message}",其中 attribute 是属性的名称,message 是特定于验证的消息。以下示例覆盖了所有 Person 属性的格式,以及特定 Person 属性 (age) 的格式。
class Person
include ActiveModel::Validations
attr_accessor :name, :age
validates :name, :age, presence: true
end
en:
activemodel: # or activerecord:
errors:
models:
person:
# Override the format for all Person attributes:
format: "Invalid %{attribute} (%{message})"
attributes:
age:
# Override the format for the age attribute:
format: "%{message}"
blank: "Please fill in your %{attribute}"
irb> person = Person.new.tap(&:valid?)
irb> person.errors.full_messages
=> [
"Invalid Name (can't be blank)",
"Please fill in your Age"
]
irb> person.errors.messages
=> {
:name => ["can't be blank"],
:age => ["Please fill in your Age"]
}
3.8. 配置 Active Record
config.active_record 包含各种配置选项
3.8.1. config.active_record.logger
接受符合 Log4r 接口或默认 Ruby Logger 类的记录器,然后将其传递给任何新的数据库连接。您可以通过在 Active Record 模型类或 Active Record 模型实例上调用 logger 来检索此记录器。设置为 nil 可禁用日志记录。
3.8.2. config.active_record.primary_key_prefix_type
允许您调整主键列的命名。默认情况下,Rails 假设主键列名为 id(此配置选项不需要设置)。还有另外两个选择
:table_name将使 Customer 类的主键为customerid。:table_name_with_underscore将使 Customer 类的主键为customer_id。
3.8.3. config.active_record.table_name_prefix
允许您设置一个全局字符串,作为表名的前缀。如果您将其设置为 northwest_,则 Customer 类将查找 northwest_customers 作为其表。默认值为空字符串。
3.8.4. config.active_record.table_name_suffix
允许您设置一个全局字符串,作为表名的后缀。如果您将其设置为 _northwest,则 Customer 类将查找 customers_northwest 作为其表。默认值为空字符串。
3.8.5. config.active_record.schema_migrations_table_name
允许您设置一个字符串,用作 schema 迁移表的名称。
3.8.6. config.active_record.internal_metadata_table_name
允许您设置一个字符串,用作内部元数据表的名称。
3.8.7. config.active_record.protected_environments
允许您设置一个环境名称数组,其中应禁止破坏性操作。
3.8.8. config.active_record.pluralize_table_names
指定 Rails 是否在数据库中查找单数或复数表名。如果设置为 true(默认值),则 Customer 类将使用 customers 表。如果设置为 false,则 Customer 类将使用 customer 表。
一些 Rails 生成器和安装程序(特别是 active_storage:install 和 action_text:install)无论此设置如何,都会创建复数表名。如果将 pluralize_table_names 设置为 false,则需要在安装后手动重命名这些表以保持一致性。此限制的存在是因为这些安装程序在迁移中使用固定的表名以实现兼容性。
3.8.9. config.active_record.default_timezone
确定从数据库中提取日期和时间时使用 Time.local(如果设置为 :local)还是 Time.utc(如果设置为 :utc)。默认值为 :utc。
3.8.10. config.active_record.schema_format
控制将数据库 schema 倾倒到文件的格式。选项是 :ruby(默认),用于依赖迁移的独立于数据库的版本,或 :sql,用于一组(可能依赖于数据库的)SQL 语句。可以通过在数据库配置中设置 schema_format 来覆盖每个数据库的此设置。
3.8.11. config.active_record.error_on_ignored_order
指定如果在批处理查询期间忽略查询的顺序是否应引发错误。选项为 true(引发错误)或 false(警告)。默认值为 false。
3.8.12. config.active_record.timestamped_migrations
控制迁移是否使用序列整数或时间戳进行编号。默认值为 true,使用时间戳,如果多个开发人员在同一个应用程序上工作,则首选时间戳。
3.8.13. config.active_record.automatically_invert_plural_associations
控制 Active Record 是否自动查找具有复数名称的反向关系。
示例
class Post < ApplicationRecord
has_many :comments
end
class Comment < ApplicationRecord
belongs_to :post
end
在上述情况下,Active Record 过去只会在 Post 中查找 :comment(单数)关联,并且找不到它。
启用此选项后,它还会查找 :comments 关联。在绝大多数情况下,发现反向关联是有益的,因为它可以防止一些无用的查询,但它可能会导致与不期望它的旧代码的向后兼容性问题。
此行为可以按模型禁用
class Comment < ApplicationRecord
self.automatically_invert_plural_associations = false
belongs_to :post
end
并按关联禁用
class Comment < ApplicationRecord
self.automatically_invert_plural_associations = true
belongs_to :post, inverse_of: nil
end
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | false |
3.8.14. config.active_record.validate_migration_timestamps
控制是否验证迁移时间戳。设置后,如果迁移的时间戳前缀比当前时间关联的时间戳提前超过一天,则会引发错误。这样做是为了防止迁移文件前置日期,这可能会影响迁移生成和其他迁移命令。config.active_record.timestamped_migrations 必须设置为 true。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | false |
| 7.2 | true |
3.8.15. config.active_record.db_warnings_action
控制当 SQL 查询产生警告时要采取的操作。以下选项可用
:ignore- 数据库警告将被忽略。这是默认值。:log- 数据库警告将通过ActiveRecord.logger在:warn级别记录。:raise- 数据库警告将作为ActiveRecord::SQLWarning引发。:report- 数据库警告将报告给 Rails 错误报告器的订阅者。自定义 proc - 可以提供自定义 proc。它应该接受一个
SQLWarning错误对象。例如
config.active_record.db_warnings_action = ->(warning) do # Report to custom exception reporting service Bugsnag.notify(warning.message) do |notification| notification.add_metadata(:warning_code, warning.code) notification.add_metadata(:warning_level, warning.level) end end
3.8.16. config.active_record.db_warnings_ignore
指定一个警告代码和消息的允许列表,无论配置的 db_warnings_action 如何,这些警告都将被忽略。默认行为是报告所有警告。要忽略的警告可以指定为字符串或正则表达式。例如
config.active_record.db_warnings_action = :raise
# The following warnings will not be raised
config.active_record.db_warnings_ignore = [
/Invalid utf8mb4 character string/,
"An exact warning message",
"1062", # MySQL Error 1062: Duplicate entry
]
3.8.17. config.active_record.migration_strategy
控制在迁移中执行 schema 语句方法所使用的策略类。默认类委托给连接适配器。自定义策略应继承自 ActiveRecord::Migration::ExecutionStrategy,或者可以继承自 DefaultStrategy,这将保留未实现方法的默认行为
class CustomMigrationStrategy < ActiveRecord::Migration::DefaultStrategy
def drop_table(*)
raise "Dropping tables is not supported!"
end
end
config.active_record.migration_strategy = CustomMigrationStrategy
3.8.18. config.active_record.schema_versions_formatter
控制 schema dumper 用于格式化版本信息的格式化程序类。可以提供自定义类以更改默认行为
class CustomSchemaVersionsFormatter
def initialize(connection)
@connection = connection
end
def format(versions)
# Special sorting of versions to reduce the likelihood of conflicts.
sorted_versions = versions.sort { |a, b| b.to_s.reverse <=> a.to_s.reverse }
sql = +"INSERT INTO schema_migrations (version) VALUES\n"
sql << sorted_versions.map { |v| "(#{@connection.quote(v)})" }.join(",\n")
sql << ";"
sql
end
end
config.active_record.schema_versions_formatter = CustomSchemaVersionsFormatter
3.8.19. config.active_record.lock_optimistically
控制 Active Record 是否使用乐观锁定,默认值为 true。
3.8.20. config.active_record.cache_timestamp_format
控制缓存键中时间戳值的格式。默认为 :usec。
3.8.21. config.active_record.record_timestamps
是一个布尔值,控制是否在模型上进行 create 和 update 操作的时间戳记录。默认值为 true。
3.8.22. config.active_record.partial_inserts
是一个布尔值,控制在创建新记录时是否使用部分写入(即插入是否只设置与默认值不同的属性)。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | true |
| 7.0 | false |
3.8.23. config.active_record.partial_updates
是一个布尔值,控制在更新现有记录时是否使用部分写入(即更新是否只设置脏属性)。请注意,当使用部分更新时,您还应该使用乐观锁定 config.active_record.lock_optimistically,因为并发更新可能会根据可能过时的读取状态写入属性。默认值为 true。
3.8.24. config.active_record.maintain_test_schema
是一个布尔值,控制 Active Record 在运行测试时是否应尝试使您的测试数据库 schema 与 db/schema.rb(或 db/structure.sql)保持最新。默认值为 true。
3.8.25. config.active_record.dump_schema_after_migration
是一个标志,控制在运行迁移时是否应进行 schema 倾倒(db/schema.rb 或 db/structure.sql)。在 Rails 生成的 config/environments/production.rb 中,此设置为 false。如果未设置此配置,则默认值为 true。
3.8.26. config.active_record.dump_schemas
控制调用 db:schema:dump 时将倾倒哪些数据库 schema。选项是 :schema_search_path(默认),它倾倒 schema_search_path 中列出的任何 schema,:all,它始终倾倒所有 schema,无论 schema_search_path 如何,或逗号分隔的 schema 字符串。
3.8.27. config.active_record.before_committed_on_all_records
启用在事务中所有已登记记录上调用 before_committed! 回调。以前的行为是,如果事务中登记了同一记录的多个副本,则仅在记录的第一个副本上运行回调。
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | false |
| 7.1 | true |
3.8.28. config.active_record.belongs_to_required_by_default
是一个布尔值,控制如果 belongs_to 关联不存在,记录是否验证失败。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | nil |
| 5.0 | true |
3.8.29. config.active_record.belongs_to_required_validates_foreign_key
当父级强制时,启用仅验证与父级相关的列的存在性。以前的行为是验证父记录的存在性,这会在每次更新子记录时执行额外的查询以获取父级,即使父级未更改。
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | true |
| 7.1 | false |
3.8.30. config.active_record.marshalling_format_version
当设置为 7.1 时,启用使用 Marshal.dump 更高效地序列化 Active Record 实例。
这会更改序列化格式,因此以这种方式序列化的模型无法被旧版本(< 7.1)的 Rails 读取。但是,无论是否启用此优化,使用旧格式的消息仍然可以读取。
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | 6.1 |
| 7.1 | 7.1 |
3.8.31. config.active_record.action_on_strict_loading_violation
如果在一个关联上设置了 strict_loading,则启用引发或记录异常。在所有环境中默认值为 :raise。可以更改为 :log,将违规发送到记录器而不是引发。
3.8.32. config.active_record.strict_loading_by_default
是一个布尔值,默认启用或禁用严格加载模式。默认为 false。
3.8.33. config.active_record.strict_loading_mode
设置严格加载报告的模式。默认为 :all。可以更改为 :n_plus_one_only,仅当加载将导致 N + 1 查询的关联时才报告。
3.8.34. config.active_record.index_nested_attribute_errors
允许嵌套 has_many 关系的错误显示索引以及错误。默认为 false。
3.8.35. config.active_record.use_schema_cache_dump
允许用户从 db/schema_cache.yml(由 bin/rails db:schema:cache:dump 生成)获取 schema 缓存信息,而无需向数据库发送查询以获取此信息。默认为 true。
3.8.36. config.active_record.cache_versioning
指示是否使用稳定的 #cache_key 方法,并伴随 #cache_version 方法中的更改版本。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | false |
| 5.2 | true |
3.8.37. config.active_record.collection_cache_versioning
通过将关系缓存键的易失性信息(最大更新时间和计数)移动到缓存版本中,从而支持缓存键重用,即使缓存的对象类型为 ActiveRecord::Relation 发生更改。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | false |
| 6.0 | true |
3.8.38. config.active_record.has_many_inversing
启用在遍历 belongs_to 到 has_many 关联时设置反向记录。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | false |
| 6.1 | true |
3.8.39. config.active_record.automatic_scope_inversing
启用自动推断带范围关联的 inverse_of。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | false |
| 7.0 | true |
3.8.40. config.active_record.destroy_association_async_job
允许指定用于在后台销毁关联记录的作业。默认值为 ActiveRecord::DestroyAssociationAsyncJob。
3.8.41. config.active_record.destroy_association_async_batch_size
允许指定通过 dependent: :destroy_async 关联选项在后台作业中销毁的最大记录数。在其他条件相同的情况下,较低的批次大小将排队更多、运行时间更短的后台作业,而较高的批次大小将排队更少、运行时间更长的后台作业。此选项默认为 nil,这将导致给定关联的所有依赖记录在同一后台作业中销毁。
3.8.42. config.active_record.queues.destroy
允许指定用于销毁作业的 Active Job 队列。当此选项为 nil 时,清除作业将发送到默认的 Active Job 队列(参见 config.active_job.default_queue_name)。默认值为 nil。
3.8.43. config.active_record.enumerate_columns_in_select_statements
当为 true 时,将始终在 SELECT 语句中包含列名,并避免通配符 SELECT * FROM ... 查询。这可以避免例如在 PostgreSQL 数据库中添加列时出现的预处理语句缓存错误。默认为 false。
3.8.44. config.active_record.verify_foreign_keys_for_fixtures
确保在测试中加载 fixture 后所有外键约束都有效。仅 PostgreSQL 和 SQLite 支持。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | false |
| 7.0 | true |
3.8.45. config.active_record.raise_on_assign_to_attr_readonly
启用在赋值给 attr_readonly 属性时引发错误。以前的行为允许赋值,但会悄悄地不将更改持久化到数据库。
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | false |
| 7.1 | true |
3.8.46. config.active_record.run_commit_callbacks_on_first_saved_instances_in_transaction
当多个 Active Record 实例在事务中更改同一条记录时,Rails 只会为其中一个实例运行 after_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.47. config.active_record.default_column_serializer
如果未明确指定给定列的序列化器实现,则使用此序列化器实现。
历史上,serialize 和 store 在允许使用替代的序列化器实现时,默认使用 YAML,但它不是一种非常高效的格式,如果使用不当,可能会成为安全漏洞的来源。
因此,建议数据库序列化优先选择更严格、更有限的格式。
不幸的是,Ruby 的标准库中并没有真正适合的默认值。JSON 可以作为一种格式,但 json gem 会将不支持的类型转换为字符串,这可能会导致错误。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | YAML |
| 7.1 | nil |
3.8.48. config.active_record.run_after_transaction_callbacks_in_order_defined
当为 true 时,after_commit 回调将按照它们在模型中定义的顺序执行。当为 false 时,它们将按相反的顺序执行。
所有其他回调总是按照它们在模型中定义的顺序执行(除非你使用 prepend: true)。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | false |
| 7.1 | true |
3.8.49. config.active_record.query_log_tags_enabled
指定是否启用适配器级别的查询注释。默认为 false,但在默认生成的 config/environments/development.rb 文件中设置为 true。
当此设置为 true 时,数据库预处理语句将自动禁用。
3.8.50. config.active_record.query_log_tags
定义一个 Array,指定要插入到 SQL 注释中的键/值标签。默认为 [ :application, :controller, :action, :job ]。可用标签为::application、:controller、:namespaced_controller、:action、:job 和 :source_location。
计算查询的 :source_location 可能会很慢,因此如果在生产环境中使用它,应该考虑其影响。
3.8.51. config.active_record.query_log_tags_format
一个 Symbol,指定用于标签的格式化器。有效值为 :sqlcommenter 和 :legacy。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | :legacy |
| 7.1 | :sqlcommenter |
3.8.52. config.active_record.cache_query_log_tags
指定是否启用查询日志标签缓存。对于有大量查询的应用程序,当请求或作业执行的生命周期内上下文不改变时,缓存查询日志标签可以提供性能优势。默认为 false。
3.8.53. config.active_record.query_log_tags_prepend_comment
指定是否将查询日志标签注释前置到查询中。
默认情况下,注释附加在查询的末尾。某些数据库(例如 MySQL)会截断查询文本。慢查询日志和查询某些 InnoDB 内部表的结果中,当查询长度超过 1024 字节时,就会出现这种情况。为了不丢失查询中的日志标签注释,可以使用此选项前置注释。
默认为 false。
3.8.54. config.active_record.schema_cache_ignored_tables
定义在生成 schema 缓存时应忽略的表列表。它接受一个由字符串(表示表名)或正则表达式组成的 Array。
3.8.55. config.active_record.verbose_query_logs
指定是否应在相关查询下方记录调用数据库查询的方法的源位置。默认情况下,在开发环境中该标志为 true,在所有其他环境中为 false。
3.8.56. config.active_record.sqlite3_adapter_strict_strings_by_default
指定 SQLite3Adapter 是否应在严格字符串模式下使用。使用严格字符串模式会禁用双引号字符串文字。
SQLite 在双引号字符串文字方面有一些怪癖。它首先尝试将双引号字符串视为标识符名称,但如果它们不存在,则将其视为字符串文字。因此,拼写错误可能会悄无声息地被忽略。例如,可以为不存在的列创建索引。有关更多详细信息,请参阅 SQLite 文档。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | false |
| 7.1 | true |
3.8.57. config.active_record.postgresql_adapter_decode_dates
指定 PostgresqlAdapter 是否应解码日期列。
ActiveRecord::Base.connection
.select_value("select '2024-01-01'::date").class #=> Date
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | false |
| 7.2 | true |
3.8.58. config.active_record.async_query_executor
指定异步查询如何池化。
它默认为 nil,这意味着 load_async 被禁用,并直接在前台执行查询。要使查询实际异步执行,必须将其设置为 :global_thread_pool 或 :multi_thread_pool。
:global_thread_pool 将为应用程序连接的所有数据库使用一个单一池。这是只有一个数据库的应用程序或一次只查询一个数据库分片的应用程序的首选配置。
:multi_thread_pool 将为每个数据库使用一个池,每个池的大小可以在 database.yml 中通过 max_threads 和 min_threads 属性单独配置。这对于定期同时查询多个数据库并需要更精确定义最大并发性的应用程序很有用。
3.8.59. config.active_record.global_executor_concurrency
与 config.active_record.async_query_executor = :global_thread_pool 结合使用,定义可以并发执行多少个异步查询。
默认为 4。
此数字必须与 database.yml 中配置的数据库连接池大小一起考虑。连接池应足够大,以容纳前台线程(即 Web 服务器或作业工作线程)和后台线程。
对于每个进程,Rails 将创建一个全局查询执行器,它使用此数量的线程来处理异步查询。因此,池大小应至少为 thread_count + global_executor_concurrency + 1。例如,如果您的 Web 服务器最多有 3 个线程,并且 global_executor_concurrency 设置为 4,那么您的池大小应至少为 8。
3.8.60. config.active_record.yaml_column_permitted_classes
默认为 [Symbol]。允许应用程序在 ActiveRecord::Coders::YAMLColumn 上包含额外的允许类到 safe_load()。
3.8.61. config.active_record.use_yaml_unsafe_load
默认为 false。允许应用程序选择在 ActiveRecord::Coders::YAMLColumn 上使用 unsafe_load。
3.8.62. config.active_record.raise_int_wider_than_64bit
默认为 true。确定当 PostgreSQL 适配器提供一个宽度大于有符号 64 位表示的整数时是否引发异常。
3.8.63. config.active_record.generate_secure_token_on
控制何时为 has_secure_token 声明生成值。默认情况下,在模型初始化时生成值。
class User < ApplicationRecord
has_secure_token
end
record = User.new
record.token # => "fwZcXX6SkJBJRogzMdciS7wf"
使用 config.active_record.generate_secure_token_on = :create,在创建模型时生成值。
# config/application.rb
config.active_record.generate_secure_token_on = :create
# app/models/user.rb
class User < ApplicationRecord
has_secure_token on: :create
end
record = User.new
record.token # => nil
record.save!
record.token # => "fwZcXX6SkJBJRogzMdciS7wf"
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | :create |
| 7.1 | :initialize |
3.8.64. config.active_record.permanent_connection_checkout
控制 ActiveRecord::Base.connection 是抛出错误、发出弃用警告,还是两者都不做。
ActiveRecord::Base.connection 从连接池中取出数据库连接并保持租用直到请求或作业结束。在使用的线程或纤程远多于可用连接的环境中,这种行为可能是不受欢迎的。
此配置可用于跟踪并消除调用 ActiveRecord::Base.connection 的代码,并将其迁移到使用 ActiveRecord::Base.with_connection。
该值可以设置为 :disallowed、:deprecated 或 true,分别表示抛出错误、发出弃用警告或两者都不做。
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | true |
3.8.65. config.active_record.database_cli
控制运行 bin/rails dbconsole 时将使用哪个 CLI 工具访问数据库。默认情况下,将使用数据库的标准工具(例如,PostgreSQL 的 psql 和 MySQL 的 mysql)。此选项接受一个哈希,用于指定每个数据库系统的工具,并且在需要回退选项时可以使用数组。
# config/application.rb
config.active_record.database_cli = { postgresql: "pgcli", mysql: %w[ mycli mysql ] }
3.8.66. config.active_record.use_legacy_signed_id_verifier
控制是否使用旧选项生成和验证签名 ID。可设置为:
:generate_and_verify(默认) - 使用以下旧选项生成和验证签名 ID{ digest: "SHA256", serializer: JSON, url_safe: true }:verify- 使用Rails.application.message_verifiers中的选项生成和验证签名 ID,但回退到使用与:generate_and_verify相同的选项进行验证。false - 仅使用
Rails.application.message_verifiers中的选项生成和验证签名 ID。
此设置的目的是为所有消息验证器提供平稳的统一配置过渡。统一配置使得密钥轮换和签名算法升级更加简单。
如果未正确配置 Rails.application.message_verifiers,将此设置为 false 可能会导致旧的签名 ID 变得不可读。使用 MessageVerifiers#rotate 或 MessageVerifiers#prepend 配置 Rails.application.message_verifiers,并附带适当的选项,例如 :digest 和 :url_safe。
3.8.67. ActiveRecord::ConnectionAdapters::Mysql2Adapter.emulate_booleans 和 ActiveRecord::ConnectionAdapters::TrilogyAdapter.emulate_booleans
控制 Active Record MySQL 适配器是否将所有 tinyint(1) 列视为布尔值。默认为 true。
3.8.68. ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.create_unlogged_tables
控制 PostgreSQL 创建的数据库表是否应为“未日志记录”,这可以加快性能,但如果数据库崩溃,会增加数据丢失的风险。强烈建议不要在生产环境中启用此功能。在所有环境中默认为 false。
要在测试中启用此功能
# config/environments/test.rb
ActiveSupport.on_load(:active_record_postgresqladapter) do
self.create_unlogged_tables = true
end
3.8.69. ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.datetime_type
控制当你在迁移或 schema 中调用 datetime 时,Active Record PostgreSQL 适配器应使用哪个原生类型。它接受一个符号,该符号必须与配置的 NATIVE_DATABASE_TYPES 中的一个相对应。默认值为 :timestamp,这意味着迁移中的 t.datetime 将创建一个“不带时区的时间戳”列。
要使用“带时区的时间戳”
# config/application.rb
ActiveSupport.on_load(:active_record_postgresqladapter) do
self.datetime_type = :timestamptz
end
如果更改此设置,您应该运行 bin/rails db:migrate 以重建您的 schema.rb。
3.8.70. ActiveRecord::SchemaDumper.ignore_tables
接受一个不应包含在任何生成的 schema 文件中的表数组。
3.8.71. ActiveRecord::SchemaDumper.fk_ignore_pattern
允许设置不同的正则表达式,该正则表达式将用于决定外键的名称是否应转储到 db/schema.rb。默认情况下,以 fk_rails_ 开头的外键名称不导出到数据库 schema 转储。默认为 /^fk_rails_[0-9a-f]{10}$/。
3.8.72. config.active_record.encryption.add_to_filter_parameters
启用 inspect 上加密属性的自动过滤。
默认值为 true。
3.8.73. config.active_record.encryption.hash_digest_class
设置 Active Record Encryption 使用的摘要算法。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | OpenSSL::Digest::SHA1 |
| 7.1 | OpenSSL::Digest::SHA256 |
3.8.74. config.active_record.encryption.support_sha1_for_non_deterministic_encryption
启用对使用 SHA-1 摘要类加密的现有数据进行解密的支持。当为 false 时,它将只支持在 config.active_record.encryption.hash_digest_class 中配置的摘要。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | true |
| 7.1 | false |
3.8.75. config.active_record.encryption.compressor
设置 Active Record Encryption 使用的压缩器。默认值为 Zlib。
你可以通过将其设置为响应 deflate 和 inflate 方法的类来使用自己的压缩器。
3.8.76. config.active_record.protocol_adapters
当使用 URL 配置数据库连接时,此选项提供了从协议到底层数据库适配器的映射。例如,这意味着环境可以指定 DATABASE_URL=mysql:///database,Rails 会将 mysql 映射到 mysql2 适配器,但应用程序也可以覆盖这些映射。
config.active_record.protocol_adapters.mysql = "trilogy"
如果未找到映射,则协议将用作适配器名称。
3.8.77. config.active_record.deprecated_associations_options
如果存在,这必须是一个带有键 :mode 和/或 :backtrace 的哈希。
config.active_record.deprecated_associations_options = { mode: :notify, backtrace: true }
在
:warn模式下,Active Record 日志记录器会报告对已弃用关联的访问。这是默认模式。在
:raise模式下,使用会引发ActiveRecord::DeprecatedAssociationError,并附带类似的消息和异常对象中清晰的堆栈跟踪。在
:notify模式下,会发布deprecated_association.active_recordActive Support 通知。请参阅 Active Support Instrumentation guide 中有关其有效负载的详细信息。
默认情况下,回溯是禁用的。如果 :backtrace 为 true,则警告消息中包含清晰的回溯,通知在有效负载中包含 :backtrace 键,其值为干净的 Thread::Backtrace::Location 对象数组。异常始终具有干净的堆栈跟踪。
干净的回溯是使用 Active Record 回溯清理器计算的。
3.8.78. config.active_record.raise_on_missing_required_finder_order_columns
当调用依赖于顺序的查找器方法(例如 #first、#second)时,如果在关系上没有 order 值,并且模型没有可回退的任何排序列(implicit_order_column、query_constraints 或 primary_key),则会引发错误。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | false |
| 8.1 | true |
3.9. 配置 Action Controller
config.action_controller 包含许多配置设置
3.9.1. config.action_controller.asset_host
设置资产的主机。当使用 CDN 托管资产而不是应用程序服务器本身时很有用。只有当您对 Action Mailer 有不同的配置时才应使用此选项,否则请使用 config.asset_host。
3.9.2. config.action_controller.perform_caching
配置应用程序是否应执行 Action Controller 组件提供的缓存功能。在开发环境中设置为 false,在生产环境中设置为 true。如果未指定,默认值为 true。
3.9.3. config.action_controller.default_static_extension
配置用于缓存页面的扩展名。默认为 .html。
3.9.4. config.action_controller.include_all_helpers
配置是否所有视图助手都在任何地方可用,或者是否限定在相应的控制器。如果设置为 false,则 UsersHelper 方法仅对作为 UsersController 一部分渲染的视图可用。如果为 true,则 UsersHelper 方法在任何地方都可用。默认配置行为(当此选项未明确设置为 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。
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | false |
3.9.18. config.action_controller.action_on_open_redirect
控制 Rails 如何处理开放重定向尝试(重定向到外部主机)。
注意:此配置取代了已弃用的 config.action_controller.raise_on_open_redirects 选项,该选项将在未来的 Rails 版本中移除。新配置提供了更灵活的开放重定向保护控制。
当设置为 :log 时,Rails 将在检测到开放重定向时记录警告。当设置为 :notify 时,Rails 将发布 open_redirect.action_controller 通知事件。当设置为 :raise 时,Rails 将引发 ActionController::Redirecting::UnsafeRedirectError。
如果 raise_on_open_redirects 设置为 true,为了向后兼容性,它将优先于此配置,有效地强制 :raise 行为。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | :log |
| 7.0 | :raise |
3.9.19. config.action_controller.action_on_path_relative_redirect
控制 Rails 如何处理路径相对 URL 重定向。
当设置为 :log(默认)时,Rails 将在检测到路径相对 URL 重定向时记录警告。当设置为 :notify 时,Rails 将发布 unsafe_redirect.action_controller 通知事件。当设置为 :raise 时,Rails 将引发 ActionController::Redirecting::UnsafeRedirectError。
这有助于检测可能不安全的重定向,这些重定向可能被利用进行开放重定向攻击。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | :log |
| 8.1 | :raise |
3.9.20. config.action_controller.log_query_tags_around_actions
确定查询标签的控制器上下文是否将通过 around_filter 自动更新。默认值为 true。
3.9.21. config.action_controller.wrap_parameters_by_default
在 Rails 7.0 之前,新应用程序生成了一个名为 wrap_parameters.rb 的初始化器,该初始化器在 ActionController::Base 中为 JSON 请求启用了参数包装。
将此配置值设置为 true 具有与初始化器相同的行为,允许应用程序在不希望自定义参数包装行为时删除初始化器。
无论此值如何,应用程序都可以像以前一样在初始化器或每个控制器中继续自定义参数包装行为。
有关参数包装的更多信息,请参阅 ParamsWrapper。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | false |
| 7.0 | true |
3.9.22. config.action_controller.allowed_redirect_hosts
指定重定向的允许主机列表。redirect_to 将允许重定向到它们而不会引发 UnsafeRedirectError 错误。
3.9.23. ActionController::Base.wrap_parameters
配置 ParamsWrapper。这可以在顶层或单个控制器上调用。
3.9.24. config.action_controller.escape_json_responses
配置 JSON 渲染器以转义 HTML 实体和 JavaScript 中无效的 Unicode 字符。
如果您依赖 JSON 响应转义这些字符以将 JSON 文档嵌入 HTML 中的 <script> 标签,这很有用。
这主要用于升级 Rails 应用程序时的兼容性,否则您可以在特定的控制器操作中使用 render json: 的 :escape 选项。
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | true |
| 8.1 | false |
3.10. 配置 Action Dispatch
3.10.1. config.action_dispatch.cookies_serializer
指定用于 cookie 的序列化器。接受与 config.active_support.message_serializer 相同的值,此外还有 :hybrid,它是 :json_allow_marshal 的别名。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | :marshal |
| 7.0 | :json |
3.10.2. config.action_dispatch.debug_exception_log_level
配置 ActionDispatch::DebugExceptions 中间件在请求期间记录未捕获异常时使用的日志级别。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | :fatal |
| 7.1 | :error |
3.10.3. config.action_dispatch.default_headers
是一个哈希,其中包含每个响应中默认设置的 HTTP 标头。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | |
| 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.domain_extractor
配置 Action Dispatch 用于将主机名解析为域和子域组件的域提取策略。这必须是一个响应 domain_from(host, tld_length) 和 subdomains_from(host, tld_length) 方法的对象。
默认为 ActionDispatch::Http::URL::DomainExtractor,它提供了标准的域解析逻辑。您可以提供自定义提取器来实现专门的域解析行为。
class CustomDomainExtractor
def self.domain_from(host, tld_length)
# Custom domain extraction logic
end
def self.subdomains_from(host, tld_length)
# Custom subdomain extraction logic
end
end
config.action_dispatch.domain_extractor = CustomDomainExtractor
3.10.7. config.action_dispatch.ignore_accept_header
用于确定是否忽略来自请求的 accept 标头。默认为 false。
3.10.8. config.action_dispatch.x_sendfile_header
指定服务器特定的 X-Sendfile 标头。这对于从服务器加速文件发送很有用。例如,对于 Apache,它可以设置为“X-Sendfile”。
3.10.9. config.action_dispatch.http_auth_salt
设置 HTTP Auth 盐值。默认为 'http authentication'。
3.10.10. config.action_dispatch.signed_cookie_salt
设置签名 cookie 的盐值。默认为 'signed cookie'。
3.10.11. config.action_dispatch.encrypted_cookie_salt
设置加密 cookie 的盐值。默认为 'encrypted cookie'。
3.10.12. config.action_dispatch.encrypted_signed_cookie_salt
设置签名加密 cookie 的盐值。默认为 'signed encrypted cookie'。
3.10.13. config.action_dispatch.authenticated_encrypted_cookie_salt
设置认证加密 cookie 盐。默认为 'authenticated encrypted cookie'。
3.10.14. config.action_dispatch.encrypted_cookie_cipher
设置用于加密 cookie 的密码。默认为 "aes-256-gcm"。
3.10.15. config.action_dispatch.signed_cookie_digest
设置用于签名 cookie 的摘要。默认为 "SHA1"。
3.10.16. config.action_dispatch.cookies_rotations
允许轮换加密和签名 cookie 的密钥、密码和摘要。
3.10.17. config.action_dispatch.use_authenticated_cookie_encryption
控制签名和加密 cookie 是否使用 AES-256-GCM 密码或较旧的 AES-256-CBC 密码。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | false |
| 5.2 | true |
3.10.18. config.action_dispatch.use_cookies_with_metadata
启用写入带有嵌入用途元数据的 cookie。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | false |
| 6.0 | true |
3.10.19. config.action_dispatch.perform_deep_munge
配置是否对参数执行 deep_munge 方法。有关更多信息,请参阅 安全指南。它默认为 true。
3.10.20. config.action_dispatch.rescue_responses
配置哪些异常分配给 HTTP 状态。它接受一个哈希,您可以指定异常/状态对。
# It's good to use #[]= or #merge! to respect the default values
config.action_dispatch.rescue_responses["MyAuthenticationError"] = :unauthorized
使用 ActionDispatch::ExceptionWrapper.rescue_responses 观察配置。默认情况下,它定义为:
{
"ActionController::RoutingError" => :not_found,
"AbstractController::ActionNotFound" => :not_found,
"ActionController::MethodNotAllowed" => :method_not_allowed,
"ActionController::UnknownHttpMethod" => :method_not_allowed,
"ActionController::NotImplemented" => :not_implemented,
"ActionController::UnknownFormat" => :not_acceptable,
"ActionDispatch::Http::MimeNegotiation::InvalidType" => :not_acceptable,
"ActionController::MissingExactTemplate" => :not_acceptable,
"ActionController::InvalidAuthenticityToken" => :unprocessable_entity,
"ActionController::InvalidCrossOriginRequest" => :unprocessable_entity,
"ActionDispatch::Http::Parameters::ParseError" => :bad_request,
"ActionController::BadRequest" => :bad_request,
"ActionController::ParameterMissing" => :bad_request,
"Rack::QueryParser::ParameterTypeError" => :bad_request,
"Rack::QueryParser::InvalidParameterError" => :bad_request,
"ActiveRecord::RecordNotFound" => :not_found,
"ActiveRecord::StaleObjectError" => :conflict,
"ActiveRecord::RecordInvalid" => :unprocessable_entity,
"ActiveRecord::RecordNotSaved" => :unprocessable_entity
}
任何未配置的异常都将映射到 500 Internal Server Error。
3.10.21. config.action_dispatch.cookies_same_site_protection
配置设置 cookie 时 SameSite 属性的默认值。当设置为 nil 时,不添加 SameSite 属性。为了允许根据请求动态配置 SameSite 属性的值,可以指定一个 proc。例如:
config.action_dispatch.cookies_same_site_protection = ->(request) do
:strict unless request.user_agent == "TestAgent"
end
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | nil |
| 6.1 | :lax |
3.10.22. config.action_dispatch.ssl_default_redirect_status
配置在 ActionDispatch::SSL 中间件中将非 GET/HEAD 请求从 HTTP 重定向到 HTTPS 时使用的默认 HTTP 状态码。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | 307 |
| 6.1 | 308 |
3.10.23. config.action_dispatch.log_rescued_responses
启用记录 rescue_responses 中配置的那些未处理的异常。默认为 true。
3.10.24. config.action_dispatch.show_exceptions
config.action_dispatch.show_exceptions 配置控制 Action Pack(特别是 ActionDispatch::ShowExceptions 中间件)如何处理响应请求时引发的异常。
将值设置为 :all 会配置 Action Pack 捕获所有异常并渲染相应的错误页面。例如,Action Pack 会捕获 ActiveRecord::RecordNotFound 异常并以 404 Not found 状态码渲染 public/404.html 的内容。
将值设置为 :rescuable 会配置 Action Pack 捕获 config.action_dispatch.rescue_responses 中定义的异常,并抛出所有其他异常。例如,Action Pack 会捕获 ActiveRecord::RecordNotFound,但会抛出 NoMethodError。
将值设置为 :none 会配置 Action Pack 抛出所有异常。
:all- 渲染所有异常的错误页面:rescuable- 渲染config.action_dispatch.rescue_responses声明的异常的错误页面:none- 抛出所有异常
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | true |
| 7.1 | :all |
3.10.25. config.action_dispatch.strict_freshness
配置当响应中同时存在 ETag 标头和 Last-Modified 标头时,ActionDispatch::ETag 中间件是否应优先使用 ETag 标头。
如果设置为 true,当两个标头都存在时,根据 RFC 7232 第 6 节的规定,仅考虑 ETag。
如果设置为 false,当两个标头都存在时,将检查这两个标头,并且两个都必须匹配才能将响应视为新鲜。
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | false |
| 8.0 | true |
3.10.26. config.action_dispatch.always_write_cookie
如果 cookie 被标记为不安全,或者请求通过 SSL 发出,或者请求发送到 onion 服务,则会在请求结束时写入 cookie。
如果设置为 true,即使不满足这些条件,也会写入 cookie。
在 development 环境中默认为 true,在所有其他环境中为 false。
3.10.27. config.action_dispatch.verbose_redirect_logs
指定是否应在相关日志行下方记录重定向的源位置。默认情况下,在开发环境中该标志为 true,在所有其他环境中为 false。
3.10.28. ActionDispatch::Callbacks.before
接受一段代码块,在请求之前运行。
3.10.29. ActionDispatch::Callbacks.after
接受一段代码块,在请求之后运行。
3.11. 配置 Action View
config.action_view 包含少量配置设置
3.11.1. config.action_view.cache_template_loading
控制模板是否应在每个请求时重新加载。默认为 !config.enable_reloading。
3.11.2. config.action_view.field_error_proc
提供一个 HTML 生成器,用于显示来自 Active Model 的错误。该块在 Action View 模板的上下文中进行评估。默认值为:
Proc.new { |html_tag, instance| content_tag :div, html_tag, class: "field_with_errors" }
3.11.3. config.action_view.default_form_builder
告诉 Rails 默认使用哪个表单构建器。默认值为 ActionView::Helpers::FormBuilder。如果您希望您的表单构建器类在初始化后加载(以便在开发环境中每次请求时重新加载),您可以将其作为 String 传递。
3.11.4. config.action_view.logger
接受符合 Log4r 接口或默认 Ruby Logger 类的日志记录器,然后将其用于记录来自 Action View 的信息。设置为 nil 可禁用日志记录。
3.11.5. config.action_view.erb_trim_mode
控制某些 ERB 语法是否应修剪。默认为 '-',这意味着在使用 <%= -%> 或 <%= =%> 时,将修剪尾部空格和换行符。将其设置为任何其他值将关闭修剪支持。
3.11.6. config.action_view.frozen_string_literal
使用 # frozen_string_literal: true 魔法注释编译 ERB 模板,使所有字符串文字冻结并节省分配。设置为 true 以对所有视图启用它。
3.11.7. config.action_view.embed_authenticity_token_in_remote_forms
允许您为带有 remote: true 的表单设置 authenticity_token 的默认行为。默认设置为 false,这意味着远程表单将不包含 authenticity_token,这在对表单进行片段缓存时很有用。远程表单从 meta 标签获取真实性,因此除非您支持没有 JavaScript 的浏览器,否则嵌入是不必要的。在这种情况下,您可以将 authenticity_token: true 作为表单选项传递,或将此配置设置设置为 true。
3.11.8. config.action_view.prefix_partial_path_with_controller_namespace
确定是否从命名空间控制器的模板中查找子目录中的部分。例如,考虑一个名为 Admin::ArticlesController 的控制器,它渲染此模板:
<%= render @article %>
默认设置为 true,它使用 /admin/articles/_article.erb 处的部分。将值设置为 false 将渲染 /articles/_article.erb,这与从非命名空间控制器(如 ArticlesController)渲染的行为相同。
3.11.9. config.action_view.automatically_disable_submit_tag
确定 submit_tag 是否应在点击时自动禁用,默认为 true。
3.11.10. config.action_view.debug_missing_translation
确定是否将缺失的翻译键包装在 <span> 标签中。默认为 true。
3.11.11. config.action_view.form_with_generates_remote_forms
确定 form_with 是否生成远程表单。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| 5.1 | true |
| 6.1 | false |
3.11.12. config.action_view.form_with_generates_ids
确定 form_with 是否在输入上生成 ID。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | false |
| 5.2 | true |
3.11.13. config.action_view.default_enforce_utf8
确定是否使用隐藏标签生成表单,该标签强制旧版本的 Internet Explorer 以 UTF-8 编码提交表单。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | true |
| 6.0 | false |
3.11.14. config.action_view.image_loading
指定 image_tag 助手渲染的 <img> 标签的 loading 属性的默认值。例如,当设置为 "lazy" 时,image_tag 渲染的 <img> 标签将包含 loading="lazy",这会指示浏览器等到图像靠近视口时才加载它。(此值仍然可以通过将例如 loading: "eager" 传递给 image_tag 来为每个图像覆盖。)默认为 nil。
3.11.15. config.action_view.image_decoding
指定 image_tag 助手渲染的 <img> 标签的 decoding 属性的默认值。默认为 nil。
3.11.16. config.action_view.annotate_rendered_view_with_filenames
确定是否使用模板文件名注释渲染的视图。默认为 false。
3.11.17. config.action_view.preload_links_header
确定 javascript_include_tag 和 stylesheet_link_tag 是否会生成预加载资产的 link 标头。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | nil |
| 6.1 | true |
3.11.18. config.action_view.button_to_generates_button_tag
当 false 时,button_to 将根据内容传递方式(为简洁省略 <form>)在 <form> 内渲染 <button> 或 <input>。
<%= button_to "Content", "/" %>
# => <input type="submit" value="Content">
<%= button_to "/" do %>
Content
<% end %>
# => <button type="submit">Content</button>
将此值设置为 true 会使 button_to 在两种情况下都在 <form> 标签内生成 <button> 标签。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | false |
| 7.0 | true |
3.11.19. config.action_view.apply_stylesheet_media_default
确定当未提供 media 属性时,stylesheet_link_tag 是否将 screen 作为 media 属性的默认值渲染。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | true |
| 7.0 | false |
3.11.20. config.action_view.prepend_content_exfiltration_prevention
确定 form_tag 和 button_to 助手是否生成以浏览器安全(但技术上无效)HTML 开头的 HTML 标签,以确保其内容不会被任何前面的未封闭标签捕获。默认值为 false。
3.11.21. config.action_view.sanitizer_vendor
通过设置 ActionView::Helpers::SanitizeHelper.sanitizer_vendor 来配置 Action View 使用的 HTML 净化器集合。默认值取决于 config.load_defaults 目标版本。
| 从版本开始 | 默认值为 | 解析标记为 |
|---|---|---|
| (原始) | Rails::HTML4::Sanitizer |
HTML4 |
| 7.1 | Rails::HTML5::Sanitizer (见 NOTE) |
HTML5 |
Rails::HTML5::Sanitizer 在 JRuby 上不受支持,因此在 JRuby 平台上,Rails 将回退到 Rails::HTML4::Sanitizer。
3.11.22. config.action_view.remove_hidden_field_autocomplete
启用后,由 form_tag、token_tag、method_tag 生成的隐藏输入,以及 button_to 表单中包含的隐藏参数字段将省略 autocomplete="off" 属性。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | false |
| 8.1 | true |
3.11.23. config.action_view.render_tracker
配置跟踪 Action View 模板之间依赖关系的策略。
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | :regex |
| 8.1 | :ruby |
3.12. 配置 Action Mailbox
config.action_mailbox 提供以下配置选项
3.12.1. config.action_mailbox.logger
包含 Action Mailbox 使用的日志记录器。它接受符合 Log4r 接口或默认 Ruby Logger 类的日志记录器。默认值为 Rails.logger。
config.action_mailbox.logger = ActiveSupport::Logger.new(STDOUT)
3.12.2. config.action_mailbox.incinerate_after
接受一个 ActiveSupport::Duration,指示在处理 ActionMailbox::InboundEmail 记录后应销毁多长时间。默认为 30.days。
# Incinerate inbound emails 14 days after processing.
config.action_mailbox.incinerate_after = 14.days
3.12.3. config.action_mailbox.queues.incineration
接受一个符号,指示用于焚烧作业的 Active Job 队列。当此选项为 nil 时,焚烧作业将发送到默认的 Active Job 队列(参见 config.active_job.default_queue_name)。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | :action_mailbox_incineration |
| 6.1 | nil |
3.12.4. config.action_mailbox.queues.routing
接受一个符号,指示用于路由作业的 Active Job 队列。当此选项为 nil 时,路由作业将发送到默认的 Active Job 队列(参见 config.active_job.default_queue_name)。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | :action_mailbox_routing |
| 6.1 | nil |
3.12.5. config.action_mailbox.storage_service
接受一个符号,指示用于上传电子邮件的 Active Storage 服务。当此选项为 nil 时,电子邮件将上传到默认的 Active Storage 服务(参见 config.active_storage.service)。
3.13. 配置 Action Mailer
config.action_mailer 有许多可用设置。
3.13.1. config.action_mailer.asset_host
设置资产的主机。当使用 CDN 托管资产而不是应用程序服务器本身时很有用。只有当您对 Action Controller 有不同的配置时才应使用此选项,否则请使用 config.asset_host。
3.13.2. config.action_mailer.logger
接受符合 Log4r 接口或默认 Ruby Logger 类的日志记录器,然后将其用于记录来自 Action Mailer 的信息。设置为 nil 可禁用日志记录。
3.13.3. config.action_mailer.smtp_settings
允许对 :smtp 传递方法进行详细配置。它接受一个选项哈希,其中可以包含以下任何选项:
:address- 允许您使用远程邮件服务器。只需将其从默认的“localhost”设置更改即可。:port- 如果您的邮件服务器未运行在端口 25,您可以更改此端口。:domain- 如果您需要指定 HELO 域,可以在此处进行。:user_name- 如果您的邮件服务器需要身份验证,请在此设置中设置用户名。:password- 如果您的邮件服务器需要身份验证,请在此设置中设置密码。:authentication- 如果您的邮件服务器需要身份验证,您需要在此处指定身份验证类型。这是一个符号,可以是:plain、:login或:cram_md5。:enable_starttls- 连接到您的 SMTP 服务器时使用 STARTTLS,如果不支持则失败。默认为false。:enable_starttls_auto- 检测您的 SMTP 服务器是否启用 STARTTLS 并开始使用它。默认为true。:openssl_verify_mode- 使用 TLS 时,您可以设置 OpenSSL 如何检查证书。如果您需要验证自签名和/或通配符证书,这很有用。它可以是 OpenSSL 验证常量之一的名称,'none'或'peer'- 或直接常量OpenSSL::SSL::VERIFY_NONE或OpenSSL::SSL::VERIFY_PEER。:ssl/:tls- 启用 SMTP 连接使用 SMTP/TLS(SMTPS:通过直接 TLS 连接的 SMTP)。:open_timeout- 尝试打开连接时等待的秒数。:read_timeout- 读取(2) 调用超时前等待的秒数。
此外,还可以传递 Mail::SMTP 支持的任何 配置选项。
3.13.4. config.action_mailer.smtp_timeout
在版本 2.8.0 之前,mail gem 未为其 SMTP 请求配置任何默认超时。此配置使应用程序能够配置 mail gem 中 :open_timeout 和 :read_timeout 的默认值,以便请求不会无限期地卡住。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | nil |
| 7.0 | 5 |
3.13.5. config.action_mailer.sendmail_settings
允许对 :sendmail 传递方法进行详细配置。它接受一个选项哈希,其中可以包含以下任何选项:
:location- sendmail 可执行文件的位置。默认为/usr/sbin/sendmail。:arguments- 命令行参数。默认为%w[ -i ]。
3.13.6. config.action_mailer.file_settings
配置 :file 传递方法。它接受一个选项哈希,其中可以包含:
:location- 文件保存的位置。默认为"#{Rails.root}/tmp/mails"。:extension- 文件扩展名。默认为空字符串。
3.13.7. config.action_mailer.raise_delivery_errors
指定如果电子邮件递送无法完成是否抛出错误。默认为 true。
3.13.8. config.action_mailer.delivery_method
定义递送方法,默认为 :smtp。有关更多信息,请参阅 Action Mailer 指南中的配置部分。
3.13.9. config.action_mailer.perform_deliveries
指定是否实际递送邮件,默认值为 true。为了测试方便,可以将其设置为 false。
3.13.10. config.action_mailer.default_options
配置 Action Mailer 默认值。用于为每个邮件程序设置 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: "noreply@example.com"
}
3.13.11. config.action_mailer.observers
注册观察者,当邮件递送时将收到通知。
config.action_mailer.observers = ["MailObserver"]
3.13.12. config.action_mailer.interceptors
注册拦截器,这些拦截器将在发送邮件之前被调用。
config.action_mailer.interceptors = ["MailInterceptor"]
3.13.13. config.action_mailer.preview_interceptors
注册拦截器,这些拦截器将在预览邮件之前被调用。
config.action_mailer.preview_interceptors = ["MyPreviewMailInterceptor"]
3.13.14. config.action_mailer.preview_paths
指定邮件预览的位置。将路径附加到此配置选项将导致在搜索邮件预览时使用这些路径。
config.action_mailer.preview_paths << "#{Rails.root}/lib/mailer_previews"
3.13.15. config.action_mailer.show_previews
启用或禁用邮件预览。默认情况下,在开发环境中此值为 true。
config.action_mailer.show_previews = false
3.13.16. config.action_mailer.perform_caching
指定邮件程序模板是否应执行片段缓存。如果未指定,默认值为 true。
3.13.17. config.action_mailer.deliver_later_queue_name
指定用于默认递送作业的 Active Job 队列(参见 config.action_mailer.delivery_job)。当此选项设置为 nil 时,递送作业将发送到默认的 Active Job 队列(参见 config.active_job.default_queue_name)。
邮件程序类可以覆盖此选项以使用不同的队列。请注意,这仅适用于使用默认递送作业的情况。如果您的邮件程序正在使用自定义作业,则将使用其队列。
确保您的 Active Job 适配器也配置为处理指定的队列,否则递送作业可能会被静默忽略。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | :mailers |
| 6.1 | nil |
3.13.18. config.action_mailer.delivery_job
指定邮件的递送作业。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | ActionMailer::MailDeliveryJob |
| 6.0 | "ActionMailer::MailDeliveryJob" |
3.14. 配置 Active Support
Active Support 中有一些配置选项可用
3.14.1. config.active_support.bare
启用或禁用 Rails 启动时加载 active_support/all。默认为 nil,这意味着加载 active_support/all。
3.14.2. config.active_support.test_order
设置测试用例的执行顺序。可能的值为 :random 和 :sorted。默认为 :random。
3.14.3. config.active_support.escape_html_entities_in_json
启用或禁用 JSON 序列化中 HTML 实体的转义。默认为 true。
3.14.4. config.active_support.use_standard_json_time_format
启用或禁用将日期序列化为 ISO 8601 格式。默认为 true。
3.14.5. config.active_support.time_precision
设置 JSON 编码时间值的精度。默认为 3。
3.14.6. config.active_support.hash_digest_class
允许配置用于生成非敏感摘要(如 ETag 标头)的摘要类。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | OpenSSL::Digest::MD5 |
| 5.2 | OpenSSL::Digest::SHA1 |
| 7.0 | OpenSSL::Digest::SHA256 |
3.14.7. config.active_support.key_generator_hash_digest_class
允许配置用于从配置的密钥库派生秘密(例如加密 cookie)的摘要类。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | OpenSSL::Digest::SHA1 |
| 7.0 | OpenSSL::Digest::SHA256 |
3.14.8. config.active_support.use_authenticated_message_encryption
指定是否使用 AES-256-GCM 认证加密作为默认密码来加密消息,而不是 AES-256-CBC。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | false |
| 5.2 | true |
3.14.9. config.active_support.message_serializer
指定 ActiveSupport::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 序列化器支持往返一些 JSON 不支持的 Ruby 类型,例如 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.14.10. config.active_support.use_message_serializer_for_metadata
当为 true 时,启用一项性能优化,可将消息数据和元数据一起序列化。这会改变消息格式,因此以这种方式序列化的消息无法被旧版本(< 7.1)的 Rails 读取。但是,使用旧格式的消息仍然可以读取,无论是否启用此优化。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | false |
| 7.1 | true |
3.14.11. config.active_support.cache_format_version
指定用于缓存的序列化格式。可能的值为 7.0 和 7.1。
7.0 更有效地序列化缓存条目。
7.1 进一步提高了效率,并允许在不反序列化其值的情况下检测过期和版本不匹配的缓存条目。它还包括对裸字符串值(例如视图片段)的优化。
所有格式都向后和向前兼容,这意味着使用一种格式写入的缓存条目可以在使用另一种格式时读取。此行为使得在不使整个缓存失效的情况下在格式之间进行迁移变得容易。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| 7.0 | 7.0 |
| 7.1 | 7.1 |
3.14.12. config.active_support.deprecation
配置弃用警告的行为。有关可用选项的描述,请参阅 Deprecation::Behavior。
在默认生成的 config/environments 文件中,此设置为开发环境的 :log 和测试环境的 :stderr,并且在生产环境中省略,而使用 config.active_support.report_deprecations。
3.14.13. config.active_support.disallowed_deprecation
配置禁止弃用警告的行为。有关可用选项的描述,请参阅 Deprecation::Behavior。
此选项适用于开发和测试。对于生产环境,请优先使用 config.active_support.report_deprecations。
3.14.14. config.active_support.disallowed_deprecation_warnings
配置应用程序认为不允许的弃用警告。这允许例如将特定弃用视为硬性失败。
3.14.15. config.active_support.report_deprecations
当为 false 时,禁用所有弃用警告,包括来自应用程序的弃用器的禁止弃用。这包括来自 Rails 和其他可能将其弃用器添加到弃用器集合的 gem 的所有弃用,但可能无法阻止从 ActiveSupport::Deprecation 发出的所有弃用警告。
在默认生成的 config/environments 文件中,此在生产环境中设置为 false。
3.14.16. config.active_support.isolation_level
配置 Rails 内部大部分状态的局部性。如果您使用基于纤程的服务器或作业处理器(例如 falcon),您应该将其设置为 :fiber。否则,最好使用 :thread 局部性。默认为 :thread。
3.14.17. config.active_support.executor_around_test_case
配置测试套件以在测试用例周围调用 Rails.application.executor.wrap。这使得测试用例的行为更接近实际请求或作业。通常在测试中禁用的几个功能,例如 Active Record 查询缓存和异步查询,将因此启用。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | false |
| 7.0 | true |
3.14.18. ActiveSupport::Logger.silencer
设置为 false 可禁用在代码块中静默日志记录的功能。默认值为 true。
3.14.19. ActiveSupport::Cache::Store.logger
指定缓存存储操作中使用的日志记录器。
3.14.20. ActiveSupport.utc_to_local_returns_utc_offset_times
配置 ActiveSupport::TimeZone.utc_to_local 返回带有 UTC 偏移的时间,而不是包含该偏移的 UTC 时间。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | false |
| 6.1 | true |
3.14.21. config.active_support.raise_on_invalid_cache_expiration_time
指定当 Rails.cache fetch 或 write 获得无效的 expires_at 或 expires_in 时间时,是否应引发 ArgumentError。
选项为 true 和 false。如果为 false,异常将报告为 handled 并记录。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | false |
| 7.1 | true |
3.14.22. config.active_support.event_reporter_context_store
为事件报告器配置自定义上下文存储。上下文存储用于管理应附加到报告器发出的每个事件的元数据。
默认情况下,事件报告器使用 ActiveSupport::EventContext,它将上下文存储在纤程本地存储中。
要使用自定义上下文存储,请将此配置设置为实现上下文存储接口的类:
# config/application.rb
config.active_support.event_reporter_context_store = CustomContextStore
class CustomContextStore
class << self
def context
# Return the context hash
end
def set_context(context_hash)
# Append context_hash to the existing context store
end
def clear
# Clear the stored context
end
end
end
默认为 nil,这意味着使用默认的 ActiveSupport::EventContext 存储。
3.14.23. config.active_support.escape_js_separators_in_json
指定生成 JSON 时是否转义 LINE SEPARATOR (U+2028) 和 PARAGRAPH SEPARATOR (U+2029)。
历史上,这些字符在 JavaScript 字面字符串中是无效的,但 ECMAScript 2019 改变了这一点。因此,在现代浏览器中不再是一个问题:https://caniuse.cn/mdn-javascript_builtins_json_json_superset。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | true |
| 8.1 | false |
3.15. 配置 Active Job
config.active_job 提供以下配置选项
3.15.1. config.active_job.queue_adapter
设置排队后端的适配器。默认适配器为 :async。有关内置适配器的最新列表,请参阅 ActiveJob::QueueAdapters API 文档。
# Be sure to have the adapter's gem in your Gemfile
# and follow the adapter's specific installation
# and deployment instructions.
config.active_job.queue_adapter = :sidekiq
3.15.2. config.active_job.default_queue_name
可用于更改默认队列名称。默认情况下为 "default"。
config.active_job.default_queue_name = :medium_priority
3.15.3. config.active_job.queue_name_prefix
允许您为所有作业设置一个可选的、非空的队列名称前缀。默认情况下它是空的并且不使用。
以下配置将在生产环境中将给定作业排队到 production_high_priority 队列:
config.active_job.queue_name_prefix = Rails.env
class GuestsCleanupJob < ActiveJob::Base
queue_as :high_priority
#....
end
3.15.4. config.active_job.queue_name_delimiter
默认值为 '_'。如果设置了 queue_name_prefix,则 queue_name_delimiter 连接前缀和未加前缀的队列名称。
以下配置将把提供的作业排队到 video_server.low_priority 队列:
# prefix must be set for delimiter to be used
config.active_job.queue_name_prefix = "video_server"
config.active_job.queue_name_delimiter = "."
class EncoderJob < ActiveJob::Base
queue_as :low_priority
#....
end
3.15.5. config.active_job.logger
接受符合 Log4r 接口或默认 Ruby Logger 类的日志记录器,然后将其用于记录来自 Active Job 的信息。您可以通过在 Active Job 类或 Active Job 实例上调用 logger 来检索此日志记录器。设置为 nil 可禁用日志记录。
3.15.6. config.active_job.custom_serializers
允许设置自定义参数序列化器。默认为 []。
3.15.7. config.active_job.log_arguments
控制是否记录作业的参数。默认为 true。
3.15.8. config.active_job.verbose_enqueue_logs
指定是否应在相关入队日志行下方记录将后台作业入队的方法的源位置。默认情况下,在开发环境中该标志为 true,在所有其他环境中为 false。
3.15.9. config.active_job.retry_jitter
控制应用于重试失败作业时计算出的延迟时间的“抖动”(随机变化)量。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | 0.0 |
| 6.1 | 0.15 |
3.15.10. config.active_job.log_query_tags_around_perform
确定查询标签的作业上下文是否将通过 around_perform 自动更新。默认值为 true。
3.16. 配置 Action Cable
3.16.1. config.action_cable.url
接受一个字符串,用于您托管 Action Cable 服务器的 URL。如果您运行的 Action Cable 服务器与您的主应用程序分离,您将使用此选项。
3.16.2. config.action_cable.mount_path
接受一个字符串,用于在主服务器进程中挂载 Action Cable 的位置。默认为 /cable。您可以将其设置为 nil,以不在正常的 Rails 服务器中挂载 Action Cable。
您可以在 Action Cable 概述 中找到更详细的配置选项。
3.16.3. config.action_cable.precompile_assets
确定是否应将 Action Cable 资产添加到资产管道预编译中。如果未使用 Sprockets,则无效。默认值为 true。
3.16.4. config.action_cable.allow_same_origin_as_host
确定是否允许与 cable 服务器本身匹配的来源。默认值为 true。
设置为 false 可禁用同源请求的自动访问,并严格只允许配置的来源。
3.16.5. config.action_cable.allowed_request_origins
决定电缆服务器将接受的请求源。在 development 环境中,默认值为 /https?:\/\/:\d+/。
3.17. 配置 Active Storage
config.active_storage 提供以下配置选项:
3.17.1. config.active_storage.variant_processor
接受符号 :mini_magick、:vips 或 :disabled,指定是否使用 MiniMagick 或 ruby-vips 执行变体转换和 blob 分析。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | :mini_magick |
| 7.0 | :vips |
3.17.2. config.active_storage.analyzers
接受一个类数组,指示 Active Storage blob 可用的分析器。默认情况下,这定义为:
config.active_storage.analyzers = [
ActiveStorage::Analyzer::ImageAnalyzer::Vips,
ActiveStorage::Analyzer::ImageAnalyzer::ImageMagick,
ActiveStorage::Analyzer::VideoAnalyzer,
ActiveStorage::Analyzer::AudioAnalyzer
]
图像分析器可以提取图像 blob 的宽度和高度;视频分析器可以提取视频 blob 的宽度、高度、持续时间、角度、纵横比以及视频/音频通道的存在/缺失;音频分析器可以提取音频 blob 的持续时间和比特率。
如果要禁用分析器,可以将其设置为空数组:
config.active_storage.analyzers = []
3.17.3. config.active_storage.previewers
接受一个类数组,指示 Active Storage blob 中可用的图像预览器。默认情况下,这定义为:
config.active_storage.previewers = [ActiveStorage::Previewer::PopplerPDFPreviewer, ActiveStorage::Previewer::MuPDFPreviewer, ActiveStorage::Previewer::VideoPreviewer]
PopplerPDFPreviewer 和 MuPDFPreviewer 可以从 PDF blob 的第一页生成缩略图;VideoPreviewer 从视频 blob 的相关帧生成缩略图。
3.17.4. config.active_storage.paths
接受一个选项哈希,指示预览器/分析器命令的位置。默认值为 {},表示将在默认路径中查找命令。可以包含以下任何选项:
:ffprobe- ffprobe 可执行文件的位置。:mutool- mutool 可执行文件的位置。:ffmpeg- ffmpeg 可执行文件的位置。
config.active_storage.paths[:ffprobe] = "/usr/local/bin/ffprobe"
3.17.5. config.active_storage.variable_content_types
接受一个字符串数组,指示 Active Storage 可以通过变体处理器进行转换的内容类型。默认情况下,这定义为:
config.active_storage.variable_content_types = %w(image/png image/gif image/jpeg image/tiff image/bmp image/vnd.adobe.photoshop image/vnd.microsoft.icon image/webp image/avif image/heic image/heif)
3.17.6. config.active_storage.web_image_content_types
接受一个字符串数组,这些字符串被视为 Web 图像内容类型,其中可以在不转换为回退 PNG 格式的情况下处理变体。例如,如果要在应用程序中使用 AVIF 变体,可以将 image/avif 添加到此数组中。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | %w(image/png image/jpeg image/gif) |
| 7.2 | %w(image/png image/jpeg image/gif image/webp) |
3.17.7. config.active_storage.content_types_to_serve_as_binary
接受一个字符串数组,指示 Active Storage 将始终作为附件而不是内联提供的内容类型。默认情况下,这定义为:
config.active_storage.content_types_to_serve_as_binary = %w(text/html image/svg+xml application/postscript application/x-shockwave-flash text/xml application/xml application/xhtml+xml application/mathml+xml text/cache-manifest)
3.17.8. config.active_storage.content_types_allowed_inline
接受一个字符串数组,指示 Active Storage 允许作为内联提供的内容类型。默认情况下,这定义为:
config.active_storage.content_types_allowed_inline = %w(image/webp image/avif image/png image/gif image/jpeg image/tiff image/vnd.adobe.photoshop image/vnd.microsoft.icon application/pdf)
3.17.9. config.active_storage.queues.analysis
接受一个符号,指示用于分析作业的 Active Job 队列。当此选项为 nil 时,分析作业将发送到默认的 Active Job 队列(请参阅 config.active_job.default_queue_name)。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| 6.0 | :active_storage_analysis |
| 6.1 | nil |
3.17.10. config.active_storage.queues.mirror
接受一个符号,指示用于直接上传镜像作业的 Active Job 队列。当此选项为 nil 时,镜像作业将发送到默认的 Active Job 队列(请参阅 config.active_job.default_queue_name)。默认值为 nil。
3.17.11. config.active_storage.queues.preview_image
接受一个符号,指示用于预处理图像预览的 Active Job 队列。当此选项为 nil 时,作业将发送到默认的 Active Job 队列(请参阅 config.active_job.default_queue_name)。默认值为 nil。
3.17.12. config.active_storage.queues.purge
接受一个符号,指示用于清除作业的 Active Job 队列。当此选项为 nil 时,清除作业将发送到默认的 Active Job 队列(请参阅 config.active_job.default_queue_name)。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| 6.0 | :active_storage_purge |
| 6.1 | nil |
3.17.13. config.active_storage.queues.transform
接受一个符号,指示用于预处理变体的 Active Job 队列。当此选项为 nil 时,作业将发送到默认的 Active Job 队列(请参阅 config.active_job.default_queue_name)。默认值为 nil。
3.17.14. config.active_storage.logger
可用于设置 Active Storage 使用的日志记录器。接受符合 Log4r 或默认 Ruby Logger 类接口的日志记录器。
config.active_storage.logger = ActiveSupport::Logger.new(STDOUT)
3.17.15. config.active_storage.service_urls_expire_in
确定由以下方法生成的 URL 的默认有效期:
ActiveStorage::Blob#urlActiveStorage::Blob#service_url_for_direct_uploadActiveStorage::Preview#urlActiveStorage::Variant#url
默认值为 5 分钟。
3.17.16. config.active_storage.urls_expire_in
确定由 Active Storage 生成的 Rails 应用程序中 URL 的默认有效期。默认值为 nil。
3.17.17. config.active_storage.touch_attachment_records
指示 ActiveStorage::Attachments 在更新时触及其相应的记录。默认值为 true。
3.17.18. config.active_storage.routes_prefix
可用于设置 Active Storage 提供的路由的路由前缀。接受一个字符串,该字符串将添加到生成的路由前面。
config.active_storage.routes_prefix = "/files"
默认值为 /rails/active_storage。
3.17.19. config.active_storage.track_variants
确定变体是否记录在数据库中。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | false |
| 6.1 | true |
3.17.20. config.active_storage.draw_routes
可用于切换 Active Storage 路由生成。默认值为 true。
3.17.21. config.active_storage.resolve_model_to_route
可用于全局更改 Active Storage 文件的交付方式。
允许的值为:
:rails_storage_redirect:重定向到签名、短生命周期的服务 URL。:rails_storage_proxy:通过下载文件来代理文件。
默认值为 :rails_storage_redirect。
3.17.22. config.active_storage.video_preview_arguments
可用于更改 ffmpeg 生成视频预览图像的方式。
默认值取决于 config.load_defaults 目标版本
| 从版本开始 | 默认值为 |
|---|---|
| (原始) | "-y -vframes 1 -f image2" |
| 7.0 | "-vf 'select=eq(n\\,0)+eq(key\\,1)+gt(scene\\,0.015)"1+ ",loop=loop=-1:size=2,trim=start_frame=1'"2+ " -frames:v 1 -f image2"
|
3.17.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.17.24. config.active_storage.precompile_assets
确定 Active Storage 资产是否应添加到资产管道预编译中。如果未使用 Sprockets,则无效。默认值为 true。
3.18. 配置 Action Text
3.18.1. config.action_text.attachment_tag_name
接受一个字符串,用于包装附件的 HTML 标签。默认为 "action-text-attachment"。
3.18.2. config.action_text.sanitizer_vendor
通过将 ActionText::ContentHelper.sanitizer 设置为供应商的 .safe_list_sanitizer 方法返回的类的实例来配置 Action Text 使用的 HTML 清理器。默认值取决于 config.load_defaults 目标版本。
| 从版本开始 | 默认值为 | 解析标记为 |
|---|---|---|
| (原始) | Rails::HTML4::Sanitizer |
HTML4 |
| 7.1 | Rails::HTML5::Sanitizer (见 NOTE) |
HTML5 |
Rails::HTML5::Sanitizer 在 JRuby 上不受支持,因此在 JRuby 平台上,Rails 将回退到 Rails::HTML4::Sanitizer。
3.18.3. Regexp.timeout
请参阅 Ruby 关于 Regexp.timeout= 的文档。
3.19. 配置数据库
几乎每个 Rails 应用程序都将与数据库交互。您可以通过设置环境变量 ENV['DATABASE_URL'] 或使用名为 config/database.yml 的配置文件来连接数据库。
使用 config/database.yml 文件,您可以指定访问数据库所需的所有信息:
development:
adapter: postgresql
database: blog_development
pool: 5
这将使用 postgresql 适配器连接到名为 blog_development 的数据库。相同的信息可以存储在 URL 中,并通过环境变量提供,如下所示:
ENV["DATABASE_URL"] # => "postgresql:///blog_development?pool=5"
config/database.yml 文件包含 Rails 默认可运行的三个不同环境的部分:
- 当您手动与应用程序交互时,
development环境用于您的开发/本地计算机。 test环境用于运行自动化测试。production环境用于您部署应用程序供世界使用时。
如果需要,您可以在 config/database.yml 中手动指定 URL:
development:
url: postgresql:///blog_development?pool=5
config/database.yml 文件可以包含 ERB 标签 <%= %>。标签中的任何内容都将作为 Ruby 代码进行评估。您可以使用它从环境变量中提取数据或执行计算以生成所需的连接信息。
当使用 ENV['DATABASE_URL'] 或 config/database.yml 文件中的 url 键时,Rails 允许将 URL 中的协议映射到可以在应用程序内配置的数据库适配器。这允许在不修改部署环境中设置的 URL 的情况下配置适配器。请参阅:config.active_record.protocol_adapters。
您无需手动更新数据库配置。如果您查看应用程序生成器的选项,您会看到其中一个选项名为 --database。此选项允许您从最常用的关系数据库列表中选择一个适配器。您甚至可以重复运行生成器:cd .. && rails new blog --database=mysql。当您确认覆盖 config/database.yml 文件时,您的应用程序将配置为使用 MySQL 而不是 SQLite。下面是常见数据库连接的详细示例。
3.20. 连接优先级
由于有两种配置连接的方式(使用 config/database.yml 或使用环境变量),因此了解它们如何交互非常重要。
如果您的 config/database.yml 文件为空但 ENV['DATABASE_URL'] 存在,则 Rails 将通过您的环境变量连接到数据库:
$ cat config/database.yml
$ echo $DATABASE_URL
postgresql:///my_database
如果您有 config/database.yml 但没有 ENV['DATABASE_URL'],则此文件将用于连接到您的数据库:
$ cat config/database.yml
development:
adapter: postgresql
database: my_database
host: localhost
$ echo $DATABASE_URL
如果您同时设置了 config/database.yml 和 ENV['DATABASE_URL'],则 Rails 将合并配置。为了更好地理解这一点,我们必须看一些示例。
当提供重复的连接信息时,环境变量将优先:
$ cat config/database.yml
development:
adapter: sqlite3
database: NOT_my_database
host: localhost
$ echo $DATABASE_URL
postgresql:///my_database
$ bin/rails runner 'puts ActiveRecord::Base.configurations.inspect'
#<ActiveRecord::DatabaseConfigurations:0x00007fc8eab02880 @configurations=[
#<ActiveRecord::DatabaseConfigurations::UrlConfig:0x00007fc8eab020b0
@env_name="development", @spec_name="primary",
@config={"adapter"=>"postgresql", "database"=>"my_database", "host"=>"localhost"}
@url="postgresql:///my_database">
]
这里,适配器、主机和数据库与 ENV['DATABASE_URL'] 中的信息匹配。
如果提供非重复信息,您将获得所有唯一值,在任何冲突情况下,环境变量仍然优先。
$ cat config/database.yml
development:
adapter: sqlite3
pool: 5
$ echo $DATABASE_URL
postgresql:///my_database
$ bin/rails runner 'puts ActiveRecord::Base.configurations.inspect'
#<ActiveRecord::DatabaseConfigurations:0x00007fc8eab02880 @configurations=[
#<ActiveRecord::DatabaseConfigurations::UrlConfig:0x00007fc8eab020b0
@env_name="development", @spec_name="primary",
@config={"adapter"=>"postgresql", "database"=>"my_database", "host"=>"localhost", "pool"=>5}
@url="postgresql:///my_database">
]
由于 pool 不在 ENV['DATABASE_URL'] 提供的连接信息中,因此其信息被合并。由于 adapter 是重复的,因此 ENV['DATABASE_URL'] 连接信息获胜。
唯一明确不使用 ENV['DATABASE_URL'] 中连接信息的方法是使用 "url" 子键指定显式 URL 连接:
$ cat config/database.yml
development:
url: sqlite3:NOT_my_database
$ echo $DATABASE_URL
postgresql:///my_database
$ bin/rails runner 'puts ActiveRecord::Base.configurations.inspect'
#<ActiveRecord::DatabaseConfigurations:0x00007fc8eab02880 @configurations=[
#<ActiveRecord::DatabaseConfigurations::UrlConfig:0x00007fc8eab020b0
@env_name="development", @spec_name="primary",
@config={"adapter"=>"sqlite3", "database"=>"NOT_my_database"}
@url="sqlite3:NOT_my_database">
]
这里,ENV['DATABASE_URL'] 中的连接信息被忽略,请注意不同的适配器和数据库名称。
由于可以在 config/database.yml 中嵌入 ERB,因此最好明确表明您正在使用 ENV['DATABASE_URL'] 连接到数据库。这在生产环境中特别有用,因为您不应将数据库密码等秘密提交到源代码管理(如 Git)中。
$ cat config/database.yml
production:
url: <%= ENV['DATABASE_URL'] %>
现在行为很清楚,我们只使用 ENV['DATABASE_URL'] 中的连接信息。
3.20.1. 配置 SQLite3 数据库
Rails 内置支持 SQLite3,它是一个轻量级的无服务器数据库应用程序。虽然 Rails 更好地配置了 SQLite 以适应生产工作负载,但繁忙的生产环境可能会使 SQLite 过载。Rails 在创建新项目时默认使用 SQLite 数据库,因为它是一个无需配置即可运行的数据库,但您以后可以随时更改它。
以下是默认配置文件(config/database.yml)中开发环境的连接信息部分:
development:
adapter: sqlite3
database: storage/development.sqlite3
pool: 5
timeout: 5000
使用 sqlite3 gem v2.4.0 或更高版本时,通过配置 extensions 支持 SQLite 扩展:
development:
adapter: sqlite3
extensions:
- SQLean::UUID # module name responding to `.to_path`
- .sqlpkg/nalgeon/crypto/crypto.so # or a filesystem path
- <%= AppExtensions.location %> # or ruby code returning a path
通过扩展,可以向 SQLite 添加许多有用的功能。您可能希望浏览 SQLite 扩展中心 或使用 sqlpkg-ruby 和 sqlean-ruby 等 gem 来简化扩展管理。
SQLite3Adapter 文档 中描述了其他配置选项。
3.20.2. 配置 MySQL 或 MariaDB 数据库
如果您选择使用 MySQL 或 MariaDB 而不是随附的 SQLite3 数据库,您的 config/database.yml 会略有不同。以下是开发部分:
development:
adapter: mysql2
encoding: utf8mb4
database: blog_development
pool: 5
username: root
password:
socket: /tmp/mysql.sock
如果您的开发数据库具有空密码的 root 用户,则此配置应该适合您。否则,请根据需要更改 development 部分中的用户名和密码。
如果您的 MySQL 版本是 5.5 或 5.6,并且希望默认使用 utf8mb4 字符集,请通过启用 innodb_large_prefix 系统变量来配置您的 MySQL 服务器以支持更长的键前缀。
MySQL 默认启用咨询锁,并用于使数据库迁移并发安全。您可以通过将 advisory_locks 设置为 false 来禁用咨询锁:
production:
adapter: mysql2
advisory_locks: false
3.20.3. 配置 PostgreSQL 数据库
如果您选择使用 PostgreSQL,您的 config/database.yml 将定制为使用 PostgreSQL 数据库:
development:
adapter: postgresql
encoding: unicode
database: blog_development
pool: 5
默认情况下,Active Record 使用称为咨询锁的数据库功能。如果您使用 PgBouncer 等外部连接池器,则可能需要禁用此功能:
production:
adapter: postgresql
advisory_locks: false
如果启用,Active Record 默认情况下将为每个数据库连接创建最多 1000 个预处理语句。要修改此行为,您可以将 statement_limit 设置为不同的值:
production:
adapter: postgresql
statement_limit: 200
使用的预处理语句越多:您的数据库将需要更多的内存。如果您的 PostgreSQL 数据库达到内存限制,请尝试降低 statement_limit 或禁用预处理语句。
3.20.4. 为 JRuby 平台配置 SQLite3 数据库
如果您选择使用 SQLite3 并使用 JRuby,您的 config/database.yml 会略有不同。以下是开发部分:
development:
adapter: jdbcsqlite3
database: storage/development.sqlite3
3.20.5. 为 JRuby 平台配置 MySQL 或 MariaDB 数据库
如果您选择使用 MySQL 或 MariaDB 并使用 JRuby,您的 config/database.yml 会略有不同。以下是开发部分:
development:
adapter: jdbcmysql
database: blog_development
username: root
password:
3.20.6. 为 JRuby 平台配置 PostgreSQL 数据库
如果您选择使用 PostgreSQL 并使用 JRuby,您的 config/database.yml 会略有不同。以下是开发部分:
development:
adapter: jdbcpostgresql
encoding: unicode
database: blog_development
username: blog
password:
根据需要更改 development 部分中的用户名和密码。
3.20.7. 配置元数据存储
默认情况下,Rails 会将您的 Rails 环境和 schema 信息存储在一个名为 ar_internal_metadata 的内部表中。
要禁用每个连接的此功能,请在数据库配置中设置 use_metadata_table。这在使用共享数据库和/或无法创建表的数据库用户时非常有用。
development:
adapter: postgresql
use_metadata_table: false
3.20.8. 配置重试行为
默认情况下,如果出现问题,Rails 将自动重新连接到数据库服务器并重试某些查询。只有安全可重试(幂等)的查询才会重试。重试次数可以通过数据库配置中的 connection_retries 指定,或通过将值设置为 0 来禁用。默认重试次数为 1。
development:
adapter: mysql2
connection_retries: 3
数据库配置还允许配置 retry_deadline。如果配置了 retry_deadline,并且查询首次尝试时已超过指定时间,则即使该查询是幂等的并且还有 connection_retries 剩余,也不会重试。例如,retry_deadline 为 5 秒意味着,如果查询首次尝试以来已过去 5 秒,即使它是幂等的并且还有 connection_retries 剩余,我们也不会重试该查询。
此值默认为 nil,这意味着所有可重试的查询都将重试,无论经过的时间如何。此配置的值应以秒为单位指定。
development:
adapter: mysql2
retry_deadline: 5 # Stop retrying queries after 5 seconds
3.20.9. 配置查询缓存
默认情况下,Rails 会自动缓存查询返回的结果集。如果 Rails 在该请求或作业中再次遇到相同的查询,它将使用缓存的结果集,而不是再次针对数据库运行查询。
查询缓存存储在内存中,为了避免使用过多内存,它会在达到阈值时自动清除最近最少使用的查询。默认情况下,阈值为 100,但可以在 database.yml 中配置。
development:
adapter: mysql2
query_cache: 200
要完全禁用查询缓存,可以将其设置为 false:
development:
adapter: mysql2
query_cache: false
3.21. 创建 Rails 环境
默认情况下,Rails 附带三个环境:“development”、“test”和“production”。虽然这些足以满足大多数用例,但在某些情况下您可能需要更多环境。
假设您有一个镜像生产环境但仅用于测试的服务器。这样的服务器通常称为“staging server”。要为该服务器定义一个名为“staging”的环境,只需创建一个名为 config/environments/staging.rb 的文件。由于这是一个类似生产的环境,您可以将 config/environments/production.rb 的内容复制作为起点,并从那里进行必要的更改。也可以像这样要求和扩展其他环境配置:
# config/environments/staging.rb
require_relative "production"
Rails.application.configure do
# Staging overrides
end
该环境与默认环境没有区别,可以使用 bin/rails server -e staging 启动服务器,使用 bin/rails console -e staging 启动控制台,Rails.env.staging? 工作正常,等等。
3.22. 部署到子目录(相对 URL 根)
默认情况下,Rails 期望您的应用程序在根目录(例如 /)下运行。本节解释了如何在目录中运行您的应用程序。
假设我们要将应用程序部署到“/app1”。Rails 需要知道此目录才能生成适当的路由:
config.relative_url_root = "/app1"
或者,您可以设置 RAILS_RELATIVE_URL_ROOT 环境变量。
Rails 现在将在生成链接时预先添加“/app1”。
3.22.1. 使用 Passenger
Passenger 可以轻松地在子目录中运行您的应用程序。您可以在 Passenger 手册 中找到相关配置。
3.22.2. 使用反向代理
使用反向代理部署应用程序比传统部署具有明显的优势。它们允许您通过分层应用程序所需的组件来更好地控制服务器。
许多现代 Web 服务器可以用作代理服务器,以平衡缓存服务器或应用程序服务器等第三方元素。
您可以使用的此类应用程序服务器之一是 Unicorn,它运行在反向代理后面。
在这种情况下,您需要配置代理服务器(NGINX、Apache 等)以接受来自应用程序服务器(Unicorn)的连接。默认情况下,Unicorn 将侦听端口 8080 上的 TCP 连接,但您可以更改端口或将其配置为使用套接字。
您可以在 Unicorn 自述文件 中找到更多信息,并了解其背后的理念。
配置好应用程序服务器后,您必须通过适当配置您的 Web 服务器来代理对其的请求。例如,您的 NGINX 配置可能包含:
upstream application_server {
server 0.0.0.0:8080;
}
server {
listen 80;
server_name localhost;
root /root/path/to/your_app/public;
try_files $uri/index.html $uri.html @app;
location @app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://application_server;
}
# some other configuration
}
请务必阅读 NGINX 文档 以获取最新信息。
4. Rails 环境设置
Rails 的某些部分也可以通过提供环境变量进行外部配置。Rails 的各个部分识别以下环境变量:
ENV["RAILS_ENV"]定义 Rails 将在其中运行的 Rails 环境(生产、开发、测试等)。当您将应用程序部署到子目录时,路由代码使用
ENV["RAILS_RELATIVE_URL_ROOT"]来识别 URL。ENV["RAILS_CACHE_ID"]和ENV["RAILS_APP_VERSION"]用于在 Rails 的缓存代码中生成扩展缓存键。这允许您从同一个应用程序拥有多个独立的缓存。
5. 使用初始化器文件
加载框架和应用程序中的任何 gem 后,Rails 将加载初始化器。初始化器是应用程序中 config/initializers 下的任何 Ruby 文件。您可以使用初始化器来保存应在所有框架和 gem 加载后进行的配置设置,例如配置这些部分的选项。
config/initializers(以及 config/initializers 的任何子目录)中的文件将作为 load_config_initializers 初始化器的一部分进行排序和加载。
如果一个初始化器中的代码依赖于另一个初始化器中的代码,您可以将它们合并到一个初始化器中。这使得依赖关系更加明确,并有助于在应用程序中发现新概念。Rails 还支持初始化器文件名的编号,但这可能导致文件名频繁更改。不建议使用 require 显式加载初始化器,因为它会导致初始化器加载两次。
不能保证您的初始化器将在所有 gem 初始化器之后运行,因此任何依赖于给定 gem 已初始化的初始化代码都应放在 config.after_initialize 块中。
6. 加载钩子
Rails 代码通常可以在应用程序加载时引用。Rails 负责这些框架的加载顺序,因此当您过早地加载 ActiveRecord::Base 等框架时,您就违反了您的应用程序与 Rails 之间的隐式契约。此外,通过在应用程序启动时加载 ActiveRecord::Base 等代码,您正在加载整个框架,这可能会减慢启动时间,并可能导致加载顺序和应用程序启动冲突。
加载和配置钩子是允许您在不违反与 Rails 的加载契约的情况下挂接到此初始化过程的 API。这还将减轻启动性能下降并避免冲突。
6.1. 避免加载 Rails 框架
由于 Ruby 是一种动态语言,某些代码会导致不同的 Rails 框架加载。以下面这段代码为例:
ActiveRecord::Base.include(MyActiveRecordHelper)
这段代码意味着当这个文件加载时,它将遇到 ActiveRecord::Base。这次遇到会导致 Ruby 查找该常量的定义并需要它。这会导致整个 Active Record 框架在启动时加载。
ActiveSupport.on_load 是一种机制,可用于将代码的加载推迟到实际需要时。上面的代码片段可以更改为:
ActiveSupport.on_load(:active_record) do
include MyActiveRecordHelper
end
这个新的代码片段只有在加载 ActiveRecord::Base 时才会包含 MyActiveRecordHelper。
6.2. 钩子何时调用?
在 Rails 框架中,当加载特定库时,会调用这些钩子。例如,当加载 ActionController::Base 时,会调用 :action_controller_base 钩子。这意味着所有带有 :action_controller_base 钩子的 ActiveSupport.on_load 调用都将在 ActionController::Base 的上下文中调用(这意味着 self 将是 ActionController::Base)。
6.3. 修改代码以使用加载钩子
修改代码通常很简单。如果您的代码行引用了 ActiveRecord::Base 等 Rails 框架,您可以将该代码包装在加载钩子中。
修改 include 调用:
ActiveRecord::Base.include(MyActiveRecordHelper)
变为:
ActiveSupport.on_load(:active_record) do
# self refers to ActiveRecord::Base here,
# so we can call .include
include MyActiveRecordHelper
end
修改 prepend 调用:
ActionController::Base.prepend(MyActionControllerHelper)
变为:
ActiveSupport.on_load(:action_controller_base) do
# self refers to ActionController::Base here,
# so we can call .prepend
prepend MyActionControllerHelper
end
修改类方法调用:
ActiveRecord::Base.include_root_in_json = true
变为:
ActiveSupport.on_load(:active_record) do
# self refers to ActiveRecord::Base here
self.include_root_in_json = true
end
6.4. 可用加载钩子
这些是您可以在自己的代码中使用的加载钩子。要挂接到以下某个类的初始化过程,请使用可用的钩子。
| 类 | 钩子 |
|---|---|
ActionCable |
action_cable |
ActionCable::Channel::Base |
action_cable_channel |
ActionCable::Connection::Base |
action_cable_connection |
ActionCable::Connection::TestCase |
action_cable_connection_test_case |
ActionController::API |
action_controller_api |
ActionController::API |
action_controller |
ActionController::Base |
action_controller_base |
ActionController::Base |
action_controller |
ActionController::TestCase |
action_controller_test_case |
ActionDispatch::IntegrationTest |
action_dispatch_integration_test |
ActionDispatch::Response |
action_dispatch_response |
ActionDispatch::Request |
action_dispatch_request |
ActionDispatch::SystemTestCase |
action_dispatch_system_test_case |
ActionMailbox::Base |
action_mailbox |
ActionMailbox::InboundEmail |
action_mailbox_inbound_email |
ActionMailbox::Record |
action_mailbox_record |
ActionMailbox::TestCase |
action_mailbox_test_case |
ActionMailer::Base |
action_mailer |
ActionMailer::TestCase |
action_mailer_test_case |
ActionText::Content |
action_text_content |
ActionText::Record |
action_text_record |
ActionText::RichText |
action_text_rich_text |
ActionText::EncryptedRichText |
action_text_encrypted_rich_text |
ActionView::Base |
action_view |
ActionView::TestCase |
action_view_test_case |
ActiveJob::Base |
active_job |
ActiveJob::TestCase |
active_job_test_case |
ActiveModel::Model |
active_model |
ActiveModel::Translation |
active_model_translation |
ActiveRecord::Base |
active_record |
ActiveRecord::DatabaseConfigurations |
active_record_database_configurations |
ActiveRecord::Encryption |
active_record_encryption |
ActiveRecord::TestFixtures |
active_record_fixtures |
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter |
active_record_postgresqladapter |
ActiveRecord::ConnectionAdapters::Mysql2Adapter |
active_record_mysql2adapter |
ActiveRecord::ConnectionAdapters::TrilogyAdapter |
active_record_trilogyadapter |
ActiveRecord::ConnectionAdapters::SQLite3Adapter |
active_record_sqlite3adapter |
ActiveStorage::Attachment |
active_storage_attachment |
ActiveStorage::VariantRecord |
active_storage_variant_record |
ActiveStorage::Blob |
active_storage_blob |
ActiveStorage::Record |
active_storage_record |
ActiveSupport::TestCase |
active_support_test_case |
i18n |
i18n |
7. 初始化事件
Rails 有 5 个初始化事件可以挂接(按运行顺序):
before_configuration:当应用程序类在config/application.rb中继承自Rails::Application时运行。在类主体执行之前。引擎可以使用此钩子在应用程序本身配置之前运行代码。before_initialize:在应用程序初始化过程(在 Rails 初始化过程开始时的:bootstrap_hook初始化器附近)发生之前直接运行。to_prepare:在所有 Railties(包括应用程序本身)的初始化器运行之后和中间件堆栈构建之后运行,但在提前加载之前。更重要的是,它将在development中每次代码重新加载时运行,但在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 个初始化器,称为“一”到“四”(按该顺序定义),并且您将“四”定义为在“二”之前但在“三”之后运行,这不合逻辑,Rails 将无法确定您的初始化器顺序。
initializer 方法的块参数是应用程序本身的实例,因此我们可以通过使用 config 方法访问其配置,如示例所示。
因为 Rails::Application 继承自 Rails::Railtie(间接),所以您可以在 config/application.rb 中使用 initializer 方法来为应用程序定义初始化器。
7.2. 初始化器
以下是 Rails 中所有初始化器的完整列表,按其定义的顺序(因此也是运行顺序,除非另有说明)排列。
load_environment_hook:作为一个占位符,以便可以定义:load_environment_config在其之前运行。load_active_support:如果config.active_support.bare为非真值(默认值),则可选地要求active_support/all。initialize_logger:为应用程序初始化日志记录器(一个ActiveSupport::BroadcastLogger对象),并使其可通过Rails.logger访问,前提是此点之前没有初始化器定义Rails.logger。initialize_cache:如果Rails.cache尚未设置,则通过引用config.cache_store中的值来初始化缓存,并将结果存储为Rails.cache。如果此对象响应middleware方法,则其中间件将插入到中间件堆栈中Rack::Runtime之前。set_clear_dependencies_hook:此初始化器——仅在config.enable_reloading设置为true时运行——使用ActionDispatch::Callbacks.after从对象空间中移除在请求期间引用的常量,以便它们将在后续请求期间重新加载。bootstrap_hook:运行所有配置的before_initialize块。i18n.callbacks:在开发环境中,设置一个to_prepare回调,如果任何语言环境自上次请求以来已更改,它将调用I18n.reload!。在生产环境中,此回调只会在第一个请求时运行。active_support.deprecation_behavior:根据Rails.application.deprecators设置config.active_support.report_deprecations、config.active_support.deprecation、config.active_support.disallowed_deprecation和config.active_support.disallowed_deprecation_warnings的弃用报告行为。active_support.initialize_time_zone:根据config.time_zone设置(默认为“UTC”)设置应用程序的默认时区。active_support.initialize_beginning_of_week:根据config.beginning_of_week设置(默认为:monday)设置应用程序的默认一周开始时间。active_support.set_configs:通过将config.active_support中的设置作为设置器send给ActiveSupport并传递值来设置 Active Support。action_dispatch.configure:配置ActionDispatch::Http::URL.tld_length,将其设置为config.action_dispatch.tld_length的值。action_view.set_configs:通过将config.action_view中的设置作为设置器send给ActionView::Base并传递值来设置 Action View。action_controller.assets_config:如果未明确配置,则将config.action_controller.assets_dir初始化为应用程序的公共目录。action_controller.set_helpers_path:将 Action Controller 的helpers_path设置为应用程序的helpers_path。action_controller.parameters_config:配置ActionController::Parameters的强参数选项。action_controller.set_configs:通过将config.action_controller中的设置作为设置器send给ActionController::Base并传递值来设置 Action Controller。action_controller.compile_config_methods:初始化指定配置设置的方法,以便更快地访问它们。active_record.initialize_timezone:将ActiveRecord::Base.time_zone_aware_attributes设置为true,并将ActiveRecord::Base.default_timezone设置为 UTC。当从数据库读取属性时,它们将转换为Time.zone指定的时区。active_record.logger:如果尚未设置,则将ActiveRecord::Base.logger设置为Rails.logger。active_record.migration_error:配置中间件以检查待处理的迁移。active_record.check_schema_cache_dump:如果已配置且可用,则加载 schema 缓存转储。active_record.set_configs:通过将config.active_record中的设置作为设置器send给ActiveRecord::Base并传递值来设置 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:通过将config.active_job中的设置作为设置器send给ActiveJob::Base并传递值来设置 Active Job。action_mailer.logger:如果尚未设置,则将ActionMailer::Base.logger设置为Rails.logger。action_mailer.set_configs:通过将config.action_mailer中的设置作为设置器send给ActionMailer::Base并传递值来设置 Action Mailer。action_mailer.compile_config_methods:初始化指定配置设置的方法,以便更快地访问它们。set_load_path:此初始化器在bootstrap_hook之前运行。将config.paths.load_paths指定的路径添加到$LOAD_PATH。除非您将config.add_autoload_paths_to_load_path设置为false,否则它还将添加config.autoload_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 应用程序中的public/index.html提供详细信息,例如 Rails 和 Ruby 版本。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:配置 Action Dispatch 以使用ActiveSupport::Callbacks.to_run重新加载路由文件。disable_dependency_loading:如果config.eager_load设置为true,则禁用自动依赖加载。
8. 数据库池
Active Record 数据库连接由 ActiveRecord::ConnectionAdapters::ConnectionPool 管理,它确保连接池同步对有限数量数据库连接的线程访问。此限制默认为 5,可在 database.yml 中配置。
development:
adapter: sqlite3
database: storage/development.sqlite3
pool: 5
timeout: 5000
由于连接池默认由 Active Record 内部处理,因此所有应用程序服务器(Thin、Puma、Unicorn 等)的行为都应相同。数据库连接池最初是空的。随着对连接的需求增加,它将创建连接,直到达到连接池限制。
任何一个请求在第一次需要访问数据库时都会检出连接。在请求结束时,它会将连接检回。这意味着额外的连接槽将再次可用于队列中的下一个请求。
如果您尝试使用超出可用数量的连接,Active Record 将阻止您并等待连接池中的连接。如果无法获取连接,则会抛出类似于下面给出的超时错误。
ActiveRecord::ConnectionTimeoutError - could not obtain a database connection within 5.000 seconds (waited 5.000 seconds)
如果您收到上述错误,您可能需要通过增加 database.yml 中的 pool 选项来增加连接池的大小:
如果您在多线程环境中运行,则可能有几个线程同时访问多个连接。因此,根据您当前的请求负载,您很可能会有多个线程争用有限数量的连接。
9. 自定义配置
您可以通过 Rails 配置对象配置自己的代码,在 config.x 命名空间下或直接在 config 下进行自定义配置。两者之间的主要区别在于,如果您定义嵌套配置(例如:config.x.nested.hi),则应使用 config.x;如果定义单层配置(例如:config.hello),则应直接使用 config。
config.x.payment_processing.schedule = :daily
config.x.payment_processing.retries = 3
config.super_debugger = true
然后可以通过配置对象获得这些配置点:
Rails.configuration.x.payment_processing.schedule # => :daily
Rails.configuration.x.payment_processing.retries # => 3
Rails.configuration.x.payment_processing.not_set # => nil
Rails.configuration.super_debugger # => true
您还可以使用 Rails::Application.config_for 加载整个配置文件:
# config/payment.yml
production:
environment: production
merchant_id: production_merchant_id
public_key: production_public_key
private_key: production_private_key
development:
environment: sandbox
merchant_id: development_merchant_id
public_key: development_public_key
private_key: development_private_key
# config/application.rb
module MyApp
class Application < Rails::Application
config.payment = config_for(:payment)
end
end
Rails.configuration.payment["merchant_id"] # => production_merchant_id or development_merchant_id
Rails::Application.config_for 支持 shared 配置以分组通用配置。共享配置将合并到环境配置中。
# config/example.yml
shared:
foo:
bar:
baz: 1
development:
foo:
bar:
qux: 2
# development environment
Rails.application.config_for(:example)[:foo][:bar] #=> { baz: 1, qux: 2 }
10. 搜索引擎索引
有时,您可能希望阻止应用程序的某些页面在 Google、Bing、Yahoo 或 Duck Duck Go 等搜索网站上可见。索引这些网站的机器人将首先分析 http://your-site.com/robots.txt 文件,以了解允许索引哪些页面。
Rails 会在 /public 文件夹中为您创建此文件。默认情况下,它允许搜索引擎索引应用程序的所有页面。如果您想阻止索引应用程序的所有页面,请使用以下内容:
User-agent: *
Disallow: /
要仅阻止特定页面,需要使用更复杂的语法。请参阅官方文档了解更多信息。