1 初始化程式碼的位置
Rails 提供了四個標準位置放置初始化程式碼
config/application.rb
- 特定環境設定檔
- 初始化器
- After-initializers
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 版本(含)之前所有版本的預設值。
以下是與每個目標版本相關聯的預設值。如果值有衝突,較新的版本優先於較舊的版本。
目標版本 7.1 的 3.1.1 預設值
config.action_controller.allow_deprecated_parameters_hash_equality
:false
config.action_dispatch.debug_exception_log_level
::error
config.action_dispatch.default_headers
:{ "X-Frame-Options" => "SAMEORIGIN", "X-XSS-Protection" => "0", "X-Content-Type-Options" => "nosniff", "X-Permitted-Cross-Domain-Policies" => "none", "Referrer-Policy" => "strict-origin-when-cross-origin" }
config.action_text.sanitizer_vendor
:Rails::HTML::Sanitizer.best_supported_vendor
config.action_view.sanitizer_vendor
:Rails::HTML::Sanitizer.best_supported_vendor
config.active_job.use_big_decimal_serializer
:true
config.active_record.allow_deprecated_singular_associations_name
:false
config.active_record.before_committed_on_all_records
:true
config.active_record.belongs_to_required_validates_foreign_key
:false
config.active_record.commit_transaction_on_non_local_return
:true
config.active_record.default_column_serializer
:nil
config.active_record.encryption.hash_digest_class
:OpenSSL::Digest::SHA256
config.active_record.encryption.support_sha1_for_non_deterministic_encryption
:false
config.active_record.generate_secure_token_on
::initialize
config.active_record.marshalling_format_version
:7.1
config.active_record.query_log_tags_format
::sqlcommenter
config.active_record.raise_on_assign_to_attr_readonly
:true
config.active_record.run_after_transaction_callbacks_in_order_defined
:true
config.active_record.run_commit_callbacks_on_first_saved_instances_in_transaction
:false
config.active_record.sqlite3_adapter_strict_strings_by_default
:true
config.active_support.cache_format_version
:7.1
config.active_support.message_serializer
::json_allow_marshal
config.active_support.raise_on_invalid_cache_expiration_time
:true
config.active_support.use_message_serializer_for_metadata
:true
config.add_autoload_paths_to_load_path
:false
config.dom_testing_default_html_version
:defined?(Nokogiri::HTML5) ? :html5 : :html4
config.log_file_size
:100 * 1024 * 1024
config.precompile_filter_parameters
:true
3.1.2 目標版本 7.0 的預設值
config.action_controller.raise_on_open_redirects
:true
config.action_controller.wrap_parameters_by_default
:true
config.action_dispatch.cookies_serializer
::json
config.action_dispatch.default_headers
:{ "X-Frame-Options" => "SAMEORIGIN", "X-XSS-Protection" => "0", "X-Content-Type-Options" => "nosniff", "X-Download-Options" => "noopen", "X-Permitted-Cross-Domain-Policies" => "none", "Referrer-Policy" => "strict-origin-when-cross-origin" }
config.action_mailer.smtp_timeout
:5
config.action_view.apply_stylesheet_media_default
:false
config.action_view.button_to_generates_button_tag
:true
config.active_record.automatic_scope_inversing
:true
config.active_record.partial_inserts
:false
config.active_record.verify_foreign_keys_for_fixtures
:true
config.active_storage.multiple_file_field_include_hidden
:true
config.active_storage.variant_processor
::vips
config.active_storage.video_preview_arguments
:"-vf 'select=eq(n\\,0)+eq(key\\,1)+gt(scene\\,0.015),loop=loop=-1:size=2,trim=start_frame=1' -frames:v 1 -f image2"
config.active_support.cache_format_version
:7.0
config.active_support.executor_around_test_case
:true
config.active_support.hash_digest_class
:OpenSSL::Digest::SHA256
config.active_support.key_generator_hash_digest_class
:OpenSSL::Digest::SHA256
3.1.3 目標版本 6.1 的預設值
ActiveSupport.utc_to_local_returns_utc_offset_times
:true
config.action_dispatch.cookies_same_site_protection
::lax
config.action_dispatch.ssl_default_redirect_status
:308
config.action_mailbox.queues.incineration
:nil
config.action_mailbox.queues.routing
:nil
config.action_mailer.deliver_later_queue_name
:nil
config.action_view.form_with_generates_remote_forms
:false
config.action_view.preload_links_header
:true
config.active_job.retry_jitter
:0.15
config.active_record.has_many_inversing
:true
config.active_storage.queues.analysis
:nil
config.active_storage.queues.purge
:nil
config.active_storage.track_variants
:true
3.1.4 目標版本 6.0 的預設值
config.action_dispatch.use_cookies_with_metadata
:true
config.action_mailer.delivery_job
:"ActionMailer::MailDeliveryJob"
config.action_view.default_enforce_utf8
:false
config.active_record.collection_cache_versioning
:true
config.active_storage.queues.analysis
::active_storage_analysis
config.active_storage.queues.purge
::active_storage_purge
3.1.5 目標版本 5.2 的預設值
config.action_controller.default_protect_from_forgery
:true
config.action_dispatch.use_authenticated_cookie_encryption
:true
config.action_view.form_with_generates_ids
:true
config.active_record.cache_versioning
:true
config.active_support.hash_digest_class
:OpenSSL::Digest::SHA1
config.active_support.use_authenticated_message_encryption
:true
3.1.6 目標版本 5.1 的預設值
config.action_view.form_with_generates_remote_forms
:true
config.assets.unknown_asset_fallback
:false
3.1.7 目標版本 5.0 的預設值
ActiveSupport.to_time_preserves_timezone
:true
config.action_controller.forgery_protection_origin_check
:true
config.action_controller.per_form_csrf_tokens
:true
config.active_record.belongs_to_required_by_default
:true
config.ssl_options
:{ hsts: { subdomains: true } }
3.2 Rails 一般設定
下列設定方法會在 Rails::Railtie
物件上呼叫,例如 Rails::Engine
或 Rails::Application
的子類別。
3.2.1 config.add_autoload_paths_to_load_path
說明是否必須將自動載入路徑加入 $LOAD_PATH
。建議在 :zeitwerk
模式早期於 config/application.rb
中設定為 false
。Zeitwerk 內部使用絕對路徑,而以 :zeitwerk
模式執行的應用程式不需要 require_dependency
,因此模型、控制器、工作等不需要在 $LOAD_PATH
中。將此設定為 false
可避免 Ruby 在使用相對路徑解析 require
呼叫時檢查這些目錄,並可節省 Bootsnap 的工作和 RAM,因為它不需要為這些目錄建立索引。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | true |
7.1 | false |
lib
目錄不受此旗標影響,它會永遠加入 $LOAD_PATH
。
3.2.2 config.after_initialize
取得一個區塊,該區塊會在 Rails 完成應用程式初始化之後執行。這包括架構本身、引擎和 config/initializers
中所有應用程式的初始化程式。請注意,此區塊會為 rake 工作執行。這對於設定由其他初始化程式設定的值很有用
config.after_initialize do
ActionView::Base.sanitized_allowed_tags.delete 'div'
end
3.2.3 config.after_routes_loaded
執行 Rails 完成載入應用程式路由後執行的區塊。當路由重新載入時,此區塊也會執行。
config.after_routes_loaded do
# Code that does something with Rails.application.routes
end
3.2.4 config.allow_concurrency
控制是否應同時處理要求。僅當應用程式程式碼非執行緒安全時,才應將此設定為 false
。預設為 true
。
3.2.5 config.asset_host
設定資產的主機。當 CDN 用於主機資產,或當您想解決瀏覽器使用不同網域別名內建的並行限制時,這會很有用。config.action_controller.asset_host
的較短版本。
3.2.6 config.assume_ssl
讓應用程式相信所有要求都透過 SSL 抵達。當透過終止 SSL 的負載平衡器進行代理時,這很有用,轉送的要求將顯示為 HTTP,而不是 HTTPS,傳送至應用程式。這會讓重新導向和 Cookie 安全性目標 HTTP,而不是 HTTPS。此中間軟體讓伺服器假設代理已終止 SSL,而且要求確實是 HTTPS。
3.2.7 config.autoflush_log
啟用立即寫入記錄檔輸出,而不是緩衝。預設為 true
。
3.2.8 config.autoload_lib(ignore:)
此方法會將 lib
新增至 config.autoload_paths
和 config.eager_load_paths
。
通常,lib
目錄有子目錄不應自動載入或急切載入。請在必要的 ignore
關鍵字參數中傳遞它們相對於 lib
的名稱。例如,
config.autoload_lib(ignore: %w(assets tasks generators))
請在 自動載入指南 中查看更多詳細資訊。
3.2.9 config.autoload_lib_once(ignore:)
config.autoload_lib_once
方法類似於 config.autoload_lib
,但它會將 lib
新增至 config.autoload_once_paths
。
透過呼叫 config.autoload_lib_once
,lib
中的類別和模組可以自動載入,甚至從應用程式初始化程式載入,但不會重新載入。
3.2.10 config.autoload_once_paths
接受 Rails 將自動載入常數的途徑陣列,這些常數不會在每個請求中被清除。如果已啟用重新載入,則此設定相關,而這在development
環境中是預設啟用的。否則,所有自動載入只會發生一次。此陣列的所有元素也必須在autoload_paths
中。預設值為空陣列。
3.2.11 config.autoload_paths
接受 Rails 將自動載入常數的途徑陣列。預設值為空陣列。自Rails 6以來,不建議調整此設定。請參閱自動載入和重新載入常數。
3.2.12 config.beginning_of_week
設定應用程式的預設週開始時間。接受以符號表示的有效星期(例如:monday
)。
3.2.13 config.cache_classes
等同於!config.enable_reloading
的舊設定。支援向後相容性。
3.2.14 config.cache_store
設定 Rails 快取要使用的快取儲存體。選項包括符號:memory_store
、:file_store
、:mem_cache_store
、:null_store
、:redis_cache_store
之一,或實作快取 API 的物件。預設為:file_store
。請參閱快取儲存體以取得每個儲存體的設定選項。
3.2.15 config.colorize_logging
指定記錄資訊時是否使用 ANSI 色碼。預設為true
。
3.2.16 config.consider_all_requests_local
是一個旗標。如果為true
,則任何錯誤都會導致在 HTTP 回應中傾印詳細的除錯資訊,而Rails::Info
控制器會在/rails/info/properties
中顯示應用程式執行時間內容。在開發和測試環境中預設為true
,在生產環境中預設為false
。若要進行更細緻的控制,請將此設定為false
,並在控制器中實作show_detailed_exceptions?
以指定哪些請求應在發生錯誤時提供除錯資訊。
3.2.17 config.console
讓您設定在執行 bin/rails console
時將用作主控台的類別。最好在 console
區塊中執行它
console do
# this block is called only when running console,
# so we can safely require pry here
require "pry"
config.console = Pry
end
3.2.18 config.content_security_policy_nonce_directives
請參閱安全性指南中的 新增 Nonce
3.2.19 config.content_security_policy_nonce_generator
請參閱安全性指南中的 新增 Nonce
3.2.20 config.content_security_policy_report_only
請參閱安全性指南中的 報告違規
3.2.21 config.credentials.content_path
加密憑證檔案的路徑。
如果存在,預設為 config/credentials/#{Rails.env}.yml.enc
,否則為 config/credentials.yml.enc
。
要讓 bin/rails credentials
指令識別此值,必須在 config/application.rb
或 config/environments/#{Rails.env}.rb
中設定。
3.2.22 config.credentials.key_path
加密憑證金鑰檔案的路徑。
如果存在,預設為 config/credentials/#{Rails.env}.key
,否則為 config/master.key
。
要讓 bin/rails credentials
指令識別此值,必須在 config/application.rb
或 config/environments/#{Rails.env}.rb
中設定。
3.2.23 config.debug_exception_response_format
設定在開發環境中發生錯誤時回應中使用的格式。對於僅限 API 的應用程式預設為 :api
,對於一般應用程式預設為 :default
。
3.2.24 config.disable_sandbox
控制是否允許某人以沙盒模式啟動主控台。這有助於避免長時間執行沙盒主控台,這可能會導致資料庫伺服器耗盡記憶體。預設為 false
。
3.2.25 config.dom_testing_default_html_version
控制 Action View、Action Dispatch 和 rails-dom-testing
中的測試輔助程式預設使用 HTML4 解析器還是 HTML5 解析器。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | :html4 |
7.1 | :html5 (請參閱附註) |
JRuby 不支援 Nokogiri 的 HTML5 解析器,因此在 JRuby 平台上,Rails 將改用 :html4
。
3.2.26 config.eager_load
當 true
時,熱切載入所有已註冊的 config.eager_load_namespaces
。這包括您的應用程式、引擎、Rails 框架以及任何其他已註冊的命名空間。
3.2.27 config.eager_load_namespaces
註冊命名空間,當 config.eager_load
設為 true
時,這些命名空間會被熱切載入。清單中的所有命名空間都必須回應 eager_load!
方法。
3.2.28 config.eager_load_paths
接受一個路徑陣列,如果 config.eager_load
為 true,Rails 將在開機時從這些路徑熱切載入。預設為應用程式 app
目錄中的每個資料夾。
3.2.29 config.enable_reloading
如果 config.enable_reloading
為 true,則在網路請求之間,應用程式類別和模組會在變更時重新載入。在 development
環境中預設為 true
,在 production
環境中預設為 false
。
謂詞 config.reloading_enabled?
也已定義。
3.2.30 config.encoding
設定應用程式範圍的編碼。預設為 UTF-8。
3.2.31 config.exceptions_app
設定當發生例外狀況時,由 ShowException
中介軟體呼叫的例外狀況應用程式。預設為 ActionDispatch::PublicExceptions.new(Rails.public_path)
。
例外狀況應用程式需要處理 ActionDispatch::Http::MimeNegotiation::InvalidType
錯誤,這些錯誤會在用戶端傳送無效的 Accept
或 Content-Type
標頭時引發。預設的 ActionDispatch::PublicExceptions
應用程式會自動執行此動作,將 Content-Type
設為 text/html
並傳回 406 Not Acceptable
狀態。如果無法處理此錯誤,將導致 500 Internal Server Error
。
使用 Rails.application.routes
RouteSet
作為例外狀況應用程式也需要這種特殊處理。它可能看起來像這樣
# config/application.rb
config.exceptions_app = CustomExceptionsAppWrapper.new(exceptions_app: routes)
# lib/custom_exceptions_app_wrapper.rb
class CustomExceptionsAppWrapper
def initialize(exceptions_app:)
@exceptions_app = exceptions_app
end
def call(env)
request = ActionDispatch::Request.new(env)
fallback_to_html_format_if_invalid_mime_type(request)
@exceptions_app.call(env)
end
private
def fallback_to_html_format_if_invalid_mime_type(request)
request.formats
rescue ActionDispatch::Http::MimeNegotiation::InvalidType
request.set_header "CONTENT_TYPE", "text/html"
end
end
3.2.32 config.file_watcher
當 config.reload_classes_only_on_change
為 true
時,用於偵測檔案系統中檔案更新的類別。Rails 預設會使用 ActiveSupport::FileUpdateChecker
,而 ActiveSupport::EventedFileUpdateChecker
(此類別依賴於 listen gem)則是另一個選項。自訂類別必須符合 ActiveSupport::FileUpdateChecker
API。
3.2.33 config.filter_parameters
用於過濾掉您不希望在記錄中顯示的參數,例如密碼或信用卡號碼。當對 Active Record 物件呼叫 #inspect
時,它也會過濾掉資料庫欄位的敏感值。預設情況下,Rails 會在 config/initializers/filter_parameter_logging.rb
中加入以下過濾器來過濾掉密碼。
Rails.application.config.filter_parameters += [
:passw, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn
]
參數過濾器會使用部分比對正規表示法。
3.2.34 config.filter_redirect
用於過濾掉應用程式記錄中的重新導向 URL。
Rails.application.config.filter_redirect += ['s3.amazonaws.com', /private-match/]
重新導向過濾器會透過測試 URL 是否包含字串或符合正規表示法來運作。
3.2.35 config.force_ssl
強制所有要求都透過 HTTPS 提供服務,並在產生 URL 時將「https://」設定為預設協定。HTTPS 的強制執行是由 ActionDispatch::SSL
中介軟體處理,可透過 config.ssl_options
進行設定。
3.2.36 config.helpers_paths
定義一個陣列,用於載入其他路徑的檢視輔助程式。
3.2.37 config.host_authorization
接受一個選項雜湊,用於設定 HostAuthorization 中介軟體
3.2.38 config.hosts
一個字串、正規表示法或 IPAddr
陣列,用於驗證 Host
標頭。由 HostAuthorization 中介軟體 使用,以協助防止 DNS 重新繫結攻擊。
3.2.39 config.javascript_path
設定您應用程式的 JavaScript 相對於 app
目錄的路徑,預設值為 javascript
。應用程式設定的 javascript_path
將會從 autoload_paths
中排除。
3.2.40 config.log_file_size
定義 Rails 日誌檔案的最大大小(以位元組為單位)。在開發和測試環境中預設為 104_857_600
(100 MiB),在所有其他環境中則無限制。
3.2.41 config.log_formatter
定義 Rails 記錄器的格式化程式。此選項在所有環境中預設為 ActiveSupport::Logger::SimpleFormatter
的執行個體。如果您要設定 config.logger
的值,您必須在將其封裝在 ActiveSupport::TaggedLogging
執行個體中之前,手動將格式化程式的值傳遞給您的記錄器,Rails 不會為您執行此動作。
3.2.42 config.log_level
定義 Rails 記錄器的詳細程度。此選項在生產環境以外的所有環境中預設為 :debug
,而在生產環境中預設為 :info
。可用的記錄等級包括::debug
、:info
、:warn
、:error
、:fatal
和 :unknown
。
3.2.43 config.log_tags
接受 request
物件會回應的方法清單、接受 request
物件的 Proc
,或會回應 to_s
的物件。這有助於使用除錯資訊(例如子網域和要求 ID)標記記錄行,這兩個資訊在除錯多使用者生產應用程式時非常有用。
3.2.44 config.logger
是將用於 Rails.logger
和任何相關 Rails 記錄(例如 ActiveRecord::Base.logger
)的記錄器。它預設為 ActiveSupport::TaggedLogging
的執行個體,它封裝了 ActiveSupport::Logger
的執行個體,該執行個體會將記錄輸出到 log/
目錄。您可以提供自訂記錄器,若要獲得完全相容性,您必須遵循下列準則
- 若要支援格式化程式,您必須手動從
config.log_formatter
值將格式化程式指派給記錄器。 - 若要支援標記記錄,記錄執行個體必須使用
ActiveSupport::TaggedLogging
封裝。 - 若要支援靜音,記錄器必須包含
ActiveSupport::LoggerSilence
模組。ActiveSupport::Logger
類別已包含這些模組。
class MyLogger < ::Logger
include ActiveSupport::LoggerSilence
end
mylogger = MyLogger.new(STDOUT)
mylogger.formatter = config.log_formatter
config.logger = ActiveSupport::TaggedLogging.new(mylogger)
3.2.45 config.middleware
允許您設定應用程式的中間件。這會在下面的 設定中間件 區段中深入探討。
3.2.46 config.precompile_filter_parameters
當為 true
時,將使用 ActiveSupport::ParameterFilter.precompile_filters
預編譯 config.filter_parameters
。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
7.1 | true |
3.2.47 config.public_file_server.enabled
設定 Rails 是否應從 public 目錄提供靜態檔案。預設為 true
。
如果伺服器軟體 (例如 NGINX 或 Apache) 應提供靜態檔案,請將此值設定為 false
。
3.2.48 config.railties_order
允許手動指定 Railties/Engines 的載入順序。預設值為 [:all]
。
config.railties_order = [Blog::Engine, :main_app, :all]
3.2.49 config.rake_eager_load
當為 true
時,在執行 Rake 任務時熱切載入應用程式。預設為 false
。
3.2.50 config.read_encrypted_secrets
已棄用:您應使用 認證,而非加密機密。
當為 true
時,將嘗試從 config/secrets.yml.enc
讀取加密機密。
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 主控台會以沙盒模式啟動。若要以非沙盒模式啟動 rails 主控台,必須指定 --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 不要處理階段。
此設定是透過一般方法呼叫來組態,而不是透過設定器。這允許傳遞其他選項
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.ssl_options
ActionDispatch::SSL
中介軟體的組態選項。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | {} |
5.0 | { hsts: { subdomains: true } } |
3.2.60 config.time_zone
設定應用程式的預設時區,並啟用 Active Record 的時區感知。
3.2.61 config.x
用於輕鬆地將巢狀自訂設定新增至應用程式設定物件
config.x.payment_processing.schedule = :daily
Rails.configuration.x.payment_processing.schedule # => :daily
請參閱 自訂設定
3.3 設定資產
3.3.1 config.assets.css_compressor
定義要使用的 CSS 壓縮器。它預設由 sass-rails
設定。目前唯一的替代值是 :yui
,它使用 yui-compressor
寶石。
3.3.2 config.assets.js_compressor
定義要使用的 JavaScript 壓縮器。可能的值為 :terser
、:closure
、:uglifier
和 :yui
,分別需要使用 terser
、closure-compiler
、uglifier
或 yui-compressor
寶石。
3.3.3 config.assets.gzip
一個標誌,用於啟用建立已編譯資產的 gzip 版本,以及未 gzip 的資產。預設設定為 true
。
3.3.4 config.assets.paths
包含用於尋找資產的路徑。將路徑附加到此設定選項,將導致在搜尋資產時使用這些路徑。
3.3.5 config.assets.precompile
允許您指定其他資產(除了 application.css
和 application.js
)在執行 bin/rails assets:precompile
時預先編譯。
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
定義要使用的資產預編譯器清單檔案的完整路徑。預設為 public 資料夾內 config.assets.prefix
目錄中的 manifest-<random>.json
檔案。
3.3.9 config.assets.digest
啟用在資產名稱中使用 SHA256 指紋。預設設定為 true
。
3.3.10 config.assets.debug
停用資產的串接和壓縮。在 development.rb
中預設設定為 true
。
3.3.11 config.assets.version
是在 SHA256 雜湊產生中使用的選項字串。這可以變更以強制重新編譯所有檔案。
3.3.12 config.assets.compile
是一個布林值,可用於在生產環境中開啟 Sprockets 即時編譯。
3.3.13 config.assets.logger
接受符合 Log4r 介面或預設 Ruby Logger
類別的記錄器。預設值與 config.logger
中設定的相同。將 config.assets.logger
設定為 false
將會關閉已提供資產的記錄。
3.3.14 config.assets.quiet
停用資產要求的記錄。在 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 控制器。預設為:scaffold_controller
。test_framework
定義要使用哪個測試架構。預設為false
,預設會使用 minitest。template_engine
定義要使用哪個範本引擎,例如 ERB 或 Haml。預設為:erb
。
3.5 設定中間件
每個 Rails 應用程式都附帶一組標準中間件,它在開發環境中按此順序使用
3.5.1 ActionDispatch::HostAuthorization
防止 DNS 重新繫結和其他 Host
標頭攻擊。它預設包含在開發環境中,並具有以下設定
Rails.application.config.hosts = [
IPAddr.new("0.0.0.0/0"), # All IPv4 addresses.
IPAddr.new("::/0"), # All IPv6 addresses.
"localhost", # The localhost reserved domain.
ENV["RAILS_DEVELOPMENT_HOSTS"] # Additional comma-separated hosts for development.
]
在其他環境中,Rails.application.config.hosts
為空,且不會執行 Host
標頭檢查。如果您想要在生產環境中防範標頭攻擊,您必須使用下列方式手動允許主機
Rails.application.config.hosts << "product.com"
請求的主機會與 hosts
項目對照,並使用案例運算子 (#===
),這讓 hosts
支援 Regexp
、Proc
和 IPAddr
等類型的項目。以下是使用正規表示式的範例。
# Allow requests from subdomains like `www.product.com` and
# `beta1.product.com`.
Rails.application.config.hosts << /.*\.product\.com/
提供的 regexp 將會用兩個錨點 (\A
和 \z
) 包起來,因此它必須與整個主機名稱相符。例如,/product.com/
一旦錨定,將無法與 www.product.com
相符。
支援一個特殊情況,允許您允許所有子網域
# Allow requests from subdomains like `www.product.com` and
# `beta1.product.com`.
Rails.application.config.hosts << ".product.com"
您可以透過設定 config.host_authorization.exclude
來排除某些要求的主機授權檢查
# Exclude requests for the /healthcheck/ path from host checking
Rails.application.config.host_authorization = {
exclude: ->(request) { request.path.include?('healthcheck') }
}
當要求傳送到未授權的主機時,預設的 Rack 應用程式將會執行並回應 403 Forbidden
。這可以透過設定 config.host_authorization.response_app
來自訂。例如
Rails.application.config.host_authorization = {
response_app: -> env do
[400, { "Content-Type" => "text/plain" }, ["Bad Request"]]
end
}
3.5.2 ActionDispatch::ServerTiming
將 Server-Timing
標頭新增到回應中,其中包含伺服器的效能指標。此資料可以在瀏覽器開發人員工具的網路面板中檢查回應時檢視。大多數瀏覽器提供一個時序標籤,用於視覺化資料。
3.5.3 ActionDispatch::SSL
強制每一個要求都使用 HTTPS 服務。如果 config.force_ssl
設為 true
,則會啟用。傳遞給此選項的選項可以透過設定 config.ssl_options
來設定。
3.5.4 ActionDispatch::Static
用於提供靜態資產。如果 config.public_file_server.enabled
是 false
,則會停用。如果您需要提供未命名為 index
的靜態目錄索引檔案,請設定 config.public_file_server.index_name
。例如,要為目錄要求提供 main.html
而不是 index.html
,請將 config.public_file_server.index_name
設為 "main"
。
3.5.5 ActionDispatch::Executor
允許執行緒安全程式碼重新載入。如果 config.allow_concurrency
是 false
,則會停用,這會導致載入 Rack::Lock
。Rack::Lock
會用互斥鎖包住應用程式,因此一次只能由一個執行緒呼叫它。
3.5.6 ActiveSupport::Cache::Strategy::LocalCache
作為一個基本的記憶體備份快取。此快取不是執行緒安全的,並且僅用於作為單一執行緒的暫時記憶體快取。
3.5.7 Rack::Runtime
設定 X-Runtime
標頭,包含執行要求所花費的時間(以秒為單位)。
3.5.8 Rails::Rack::Logger
通知記錄檔要求已開始。要求完成後,清除所有記錄檔。
3.5.9 ActionDispatch::ShowExceptions
救援應用程式傳回的任何例外,如果要求是本機的或 config.consider_all_requests_local
設為 true
,則呈現漂亮的例外頁面。如果 config.action_dispatch.show_exceptions
設為 :none
,則無論如何都會引發例外。
3.5.10 ActionDispatch::RequestId
讓回應可以使用唯一的 X-Request-Id 標頭,並啟用 ActionDispatch::Request#uuid
方法。可以使用 config.action_dispatch.request_id_header
設定。
3.5.11 ActionDispatch::RemoteIp
檢查 IP 欺騙攻擊,並從要求標頭取得有效的 client_ip
。可以使用 config.action_dispatch.ip_spoofing_check
和 config.action_dispatch.trusted_proxies
選項設定。
3.5.12 Rack::Sendfile
攔截主體從檔案提供服務的回應,並以伺服器特定的 X-Sendfile 標頭取代它。可以使用 config.action_dispatch.x_sendfile_header
設定。
3.5.13 ActionDispatch::Callbacks
在提供服務要求之前執行準備回呼。
3.5.14 ActionDispatch::Cookies
設定要求的 Cookie。
3.5.15 ActionDispatch::Session::CookieStore
負責將工作階段儲存在 Cookie 中。可以透過變更 config.session_store
來使用替代的 Middleware。
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
決定是否應為遺失的翻譯引發錯誤。預設為 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
控制是否可以在 i18n 語言環境檔案中覆寫 Error#full_message
格式。預設為 false
。
設定為 true
時,full_message
會在語言環境檔案的屬性層級和模型層級尋找格式。預設格式為 "%{attribute} %{message}"
,其中 attribute
是屬性的名稱,而 message
是驗證特定的訊息。以下範例會覆寫所有 Person
屬性的格式,以及特定 Person
屬性 (age
) 的格式。
class Person
include ActiveModel::Validations
attr_accessor :name, :age
validates :name, :age, presence: true
end
en:
activemodel: # or activerecord:
errors:
models:
person:
# Override the format for all Person attributes:
format: "Invalid %{attribute} (%{message})"
attributes:
age:
# Override the format for the age attribute:
format: "%{message}"
blank: "Please fill in your %{attribute}"
irb> person = Person.new.tap(&:valid?)
irb> person.errors.full_messages
=> [
"Invalid Name (can't be blank)",
"Please fill in your Age"
]
irb> person.errors.messages
=> {
:name => ["can't be blank"],
:age => ["Please fill in your Age"]
}
3.8 設定 Active Record
config.active_record
包含各種設定選項
3.8.1 config.active_record.logger
接受符合 Log4r 介面或預設 Ruby Logger 類別的記錄器,然後傳遞給建立的任何新資料庫連線。您可以透過在 Active Record 模型類別或 Active Record 模型執行個體上呼叫 logger
來擷取此記錄器。設定為 nil
以停用記錄。
3.8.2 config.active_record.primary_key_prefix_type
讓您調整主鍵欄位的名稱。預設情況下,Rails 假設主鍵欄位的名稱為 id
(且不需要設定此組態選項)。還有兩個其他選項
:table_name
會讓 Customer 類別的主鍵為customerid
。:table_name_with_underscore
會讓 Customer 類別的主鍵為customer_id
。
3.8.3 config.active_record.table_name_prefix
讓您設定一個全域字串,以加到資料表名稱之前。如果您將此設定為 northwest_
,則 Customer 類別會將 northwest_customers
視為其資料表。預設值為空字串。
3.8.4 config.active_record.table_name_suffix
讓您設定一個全域字串,以附加到資料表名稱之後。如果您將此設定為 _northwest
,則 Customer 類別會將 customers_northwest
視為其資料表。預設值為空字串。
3.8.5 config.active_record.schema_migrations_table_name
讓您設定一個字串,以用作架構遷移資料表的資料表名稱。
3.8.6 config.active_record.internal_metadata_table_name
讓您設定一個字串,以用作內部元資料資料表的資料表名稱。
3.8.7 config.active_record.protected_environments
讓您設定一個環境名稱陣列,其中應禁止執行破壞性動作。
3.8.8 config.active_record.pluralize_table_names
指定 Rails 會在資料庫中尋找單數或複數資料表名稱。如果設定為 true
(預設值),則 Customer 類別會使用 customers
資料表。如果設定為 false
,則 Customer 類別會使用 customer
資料表。
3.8.9 config.active_record.default_timezone
決定在從資料庫擷取日期和時間時,是要使用 Time.local
(如果設定為 :local
)還是 Time.utc
(如果設定為 :utc
)。預設值為 :utc
。
3.8.10 config.active_record.schema_format
控制將資料庫架構傾印至檔案的格式。選項為 :ruby
(預設值),此為依賴遷移的資料庫獨立版本,或 :sql
,此為一組(可能依賴資料庫)的 SQL 陳述式。
3.8.11 config.active_record.error_on_ignored_order
指定在批次查詢期間忽略查詢順序時是否應產生錯誤。選項為 true
(產生錯誤)或 false
(警告)。預設值為 false
。
3.8.12 config.active_record.timestamped_migrations
控制遷移是否使用序號整數或時間戳記編號。預設值為 true
,使用時間戳記,如果有多位開發人員處理同一應用程式,則建議使用此選項。
3.8.13 config.active_record.db_warnings_action
控制在 SQL 查詢產生警告時應執行的動作。可用的選項如下
:ignore
- 將忽略資料庫警告。這是預設值。:log
- 將透過ActiveRecord.logger
以:warn
層級記錄資料庫警告。:raise
- 將產生資料庫警告作為ActiveRecord::SQLWarning
。:report
- 將資料庫警告回報給 Rails 錯誤回報者的訂閱者。自訂程序 - 可以提供自訂程序。它應該接受
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.14 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.15 config.active_record.migration_strategy
控制在遷移中執行架構陳述式方法時使用的策略類別。預設類別委派給連線介面卡。自訂策略應繼承自 ActiveRecord::Migration::ExecutionStrategy
,或可以繼承自 DefaultStrategy
,這將保留未實作方法的預設行為
class CustomMigrationStrategy < ActiveRecord::Migration::DefaultStrategy
def drop_table(*)
raise "Dropping tables is not supported!"
end
end
config.active_record.migration_strategy = CustomMigrationStrategy
3.8.16 config.active_record.lock_optimistically
控制 Active Record 是否使用樂觀鎖定,預設為 true
。
3.8.17 config.active_record.cache_timestamp_format
控制快取金鑰中時間戳記值的格式。預設為 :usec
。
3.8.18 config.active_record.record_timestamps
布林值,用於控制模型中 create
和 update
操作是否進行時間戳記。預設值為 true
。
3.8.19 config.active_record.partial_inserts
布林值,用於控制建立新記錄時是否使用部分寫入(亦即插入時是否只設定與預設值不同的屬性)。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | true |
7.0 | false |
3.8.20 config.active_record.partial_updates
布林值,用於控制更新現有記錄時是否使用部分寫入(亦即更新時是否只設定已變更的屬性)。請注意,使用部分更新時,您還應該使用樂觀鎖定 config.active_record.lock_optimistically
,因為同時更新可能會根據可能過時的讀取狀態寫入屬性。預設值為 true
。
3.8.21 config.active_record.maintain_test_schema
布林值,用於控制 Active Record 是否嘗試在執行測試時,讓您的測試資料庫架構與 db/schema.rb
(或 db/structure.sql
)保持最新。預設為 true
。
3.8.22 config.active_record.dump_schema_after_migration
旗標,用於控制執行遷移時是否應進行架構傾印(db/schema.rb
或 db/structure.sql
)。Rails 生成的 config/environments/production.rb
中將此設定為 false
。如果未設定此組態,預設值為 true
。
3.8.23 config.active_record.dump_schemas
控制呼叫 db:schema:dump
時將傾印哪些資料庫架構。選項包括 :schema_search_path
(預設值),傾印 schema_search_path
中列出的任何架構;:all
,不論 schema_search_path
,總是傾印所有架構;或以逗號分隔的架構字串。
3.8.24 config.active_record.before_committed_on_all_records
在交易中所有已註冊記錄上啟用 before_committed! 回呼。先前的行為僅在記錄有多個副本且這些副本都註冊在交易中時,才會在記錄的第一個副本上執行回呼。
從版本開始 | 預設值為 |
---|---|
(原始) | false |
7.1 | true |
3.8.25 config.active_record.belongs_to_required_by_default
布林值,控制如果 belongs_to
關聯不存在,記錄是否會驗證失敗。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | nil |
5.0 | true |
3.8.26 config.active_record.belongs_to_required_validates_foreign_key
當父項為強制時,僅針對與父項相關的欄位啟用驗證是否存在。先前的行為是驗證父項記錄是否存在,這會在每次更新子項記錄時執行額外查詢以取得父項,即使父項沒有變更。
從版本開始 | 預設值為 |
---|---|
(原始) | true |
7.1 | false |
3.8.27 config.active_record.marshalling_format_version
設定為 7.1
時,啟用使用 Marshal.dump
對 Active Record 執行個體進行更有效率的序列化。
這會變更序列化格式,因此無法使用舊版(< 7.1)的 Rails 讀取以這種方式序列化的模型。不過,使用舊格式的訊息仍然可以讀取,不論是否啟用此最佳化。
從版本開始 | 預設值為 |
---|---|
(原始) | 6.1 |
7.1 | 7.1 |
3.8.28 config.active_record.action_on_strict_loading_violation
如果在關聯上設定 strict_loading,則啟用引發或記錄例外。預設值在所有環境中都是 :raise
。可以變更為 :log
,以將違規傳送至記錄器,而不是引發。
3.8.29 config.active_record.strict_loading_by_default
布林值,用於啟用或停用嚴格載入模式。預設為 false
。
3.8.30 config.active_record.warn_on_records_fetched_greater_than
允許設定查詢結果大小的警告閾值。如果查詢傳回的記錄數超過閾值,則會記錄警告。這可用於識別可能會造成記憶體暴增的查詢。
3.8.31 config.active_record.index_nested_attribute_errors
允許嵌套 has_many
關係的錯誤顯示索引和錯誤。預設為 false
。
3.8.32 config.active_record.use_schema_cache_dump
允許使用者從 db/schema_cache.yml
(由 bin/rails db:schema:cache:dump
產生) 取得架構快取資訊,而不必傳送查詢到資料庫取得此資訊。預設為 true
。
3.8.33 config.active_record.cache_versioning
表示是否使用穩定的 #cache_key
方法,並在 #cache_version
方法中附上變更版本。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
5.2 | true |
3.8.34 config.active_record.collection_cache_versioning
當快取的物件類型為 ActiveRecord::Relation
時,允許重複使用相同的快取金鑰,方法是將關係快取金鑰中不穩定的資訊 (最後更新時間和數量) 移至快取版本以支援快取金鑰回收。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
6.0 | true |
3.8.35 config.active_record.has_many_inversing
允許在遍歷 belongs_to
到 has_many
關聯時設定反向記錄。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
6.1 | true |
3.8.36 config.active_record.automatic_scope_inversing
允許自動推論具有範圍的關聯的 inverse_of
。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
7.0 | true |
3.8.37 config.active_record.destroy_association_async_job
允許指定用於在背景中銷毀關聯記錄的作業。預設為 ActiveRecord::DestroyAssociationAsyncJob
。
3.8.38 config.active_record.destroy_association_async_batch_size
允許指定背景工作中 dependent: :destroy_async
關聯選項將銷毀的最大記錄數。其他條件相同,較小的批次大小將排入更多、執行時間較短的背景工作,而較大的批次大小將排入較少、執行時間較長的背景工作。此選項預設為 nil
,這將導致給定關聯的所有依賴記錄在同一個背景工作中被銷毀。
3.8.39 config.active_record.queues.destroy
允許指定用於銷毀工作的 Active Job 佇列。當此選項為 nil
時,清除工作會傳送至預設的 Active Job 佇列(請參閱 config.active_job.default_queue_name
)。其預設為 nil
。
3.8.40 config.active_record.enumerate_columns_in_select_statements
當為 true
時,將始終在 SELECT
陳述式中包含欄位名稱,並避免萬用字元 SELECT * FROM ...
查詢。這可以避免在資料庫中新增欄位時發生準備好的陳述式快取錯誤,例如 PostgreSQL。預設為 false
。
3.8.41 config.active_record.verify_foreign_keys_for_fixtures
確保在測試中載入固定裝置後所有外來金鑰約束都為有效。僅由 PostgreSQL 和 SQLite 支援。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
7.0 | true |
3.8.42 config.active_record.commit_transaction_on_non_local_return
定義 transaction
區塊中的 return
、break
和 throw
是否會導致提交或回滾交易。例如:
Model.transaction do
model.save
return
other_model.save # not executed
end
如果設為 false
,它將會被回滾。
如果設為 true
,上述交易將會被提交。
從版本開始 | 預設值為 |
---|---|
(原始) | false |
7.1 | true |
歷史上,只有引發的錯誤才會觸發回滾,但在 Ruby 2.3
中,timeout
函式庫開始使用 throw
來中斷執行,這會產生提交開啟交易的不良影響。
為了解決這個問題,在 Active Record 6.1 中,行為被更改為回滾交易,因為這比潛在提交不完整的交易更安全。
從 Rails 6.1 開始,在 transaction
區塊中使用 return
、break
或 throw
基本上已不建議使用。
然而,隨著 timeout 0.4.0
的發布,Timeout.timeout
現在又會引發錯誤,而 Active Record 能夠恢復到其原始的、較不令人驚訝的行為。
3.8.43 config.active_record.raise_on_assign_to_attr_readonly
啟用對 attr_readonly 屬性進行指定時引發錯誤。先前的行為允許指定,但不會將變更靜默地保留到資料庫中。
從版本開始 | 預設值為 |
---|---|
(原始) | false |
7.1 | true |
3.8.44 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.45 config.active_record.default_column_serializer
如果未明確指定特定欄位的序列化器實作,則要使用的序列化器實作。
歷史上,serialize
和 store
允許使用替代序列化器實作,但預設會使用 YAML
,但這不是一種非常有效率的格式,如果沒有小心使用,可能會成為安全漏洞的來源。
因此,建議優先使用更嚴謹、更有限的資料庫序列化格式。
很不幸的是,Ruby 標準函式庫中沒有真正適用的預設值。JSON
可以作為一種格式,但 json
寶石會將不受支援的類型轉換為字串,這可能會導致錯誤。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | YAML |
7.1 | nil |
3.8.46 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.47 config.active_record.query_log_tags_enabled
指定是否啟用適配器層級的查詢註解。預設為 false
。
當這項設定為 true
時,資料庫準備好的陳述式會自動停用。
3.8.48 config.active_record.query_log_tags
定義一個 Array
,指定要插入 SQL 註解中的金鑰/值標籤。預設為 [ :application ]
,一個預先定義的標籤,用於傳回應用程式名稱。
3.8.49 config.active_record.query_log_tags_format
一個 Symbol
,指定要對標籤使用的格式化程式。有效值為 :sqlcommenter
和 :legacy
。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | :legacy |
7.1 | :sqlcommenter |
3.8.50 config.active_record.cache_query_log_tags
指定是否啟用查詢記錄標籤快取。對於有大量查詢的應用程式,在請求或工作執行期間內容未變更時,快取查詢記錄標籤可以提供效能優勢。預設為 false
。
3.8.51 config.active_record.schema_cache_ignored_tables
定義產生架構快取時應忽略的表格清單。它接受一個字串 Array
,代表表格名稱或正規表示式。
3.8.52 config.active_record.verbose_query_logs
指定呼叫資料庫查詢的方法的來源位置是否應記錄在相關查詢下方。預設情況下,此旗標在開發環境中為 true
,在所有其他環境中為 false
。
3.8.53 config.active_record.sqlite3_adapter_strict_strings_by_default
指定是否應在嚴格字串模式中使用 SQLite3Adapter。使用嚴格字串模式會停用雙引號字串文字。
SQLite 在雙引號字串文字方面有一些怪癖。它首先嘗試將雙引號字串視為識別名稱,但如果它們不存在,則將它們視為字串文字。因此,錯字可能會靜默地被忽略。例如,可以為不存在的欄位建立索引。有關更多詳細資訊,請參閱 SQLite 文件。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
7.1 | true |
3.8.54 config.active_record.async_query_executor
指定如何集中非同步查詢。
預設為 nil
,表示已停用 load_async
,而是在前景直接執行查詢。要實際非同步執行查詢,必須將其設定為 :global_thread_pool
或 :multi_thread_pool
。
:global_thread_pool
將為應用程式連線的所有資料庫使用單一集中。這是僅有一個資料庫或一次只查詢一個資料庫分片的應用程式的首選組態。
:multi_thread_pool
將為每個資料庫使用一個集中,並且每個集中大小都可以在 database.yml
中透過 max_threads
和 min_thread
屬性個別設定。這對於定期同時查詢多個資料庫且需要更精確定義最大並行度的應用程式很有用。
3.8.55 config.active_record.global_executor_concurrency
與 config.active_record.async_query_executor = :global_thread_pool
結合使用,定義可以同時執行多少個非同步查詢。
預設為 4
。
此數字必須根據 database.yml
中設定的資料庫池大小來考量。連線池應足夠大,以容納前景執行緒(例如 Web 伺服器或工作執行緒)和背景執行緒。
3.8.56 config.active_record.allow_deprecated_singular_associations_name
這會啟用已棄用行為,其中單數關聯可以在 where
子句中以其複數名稱來參照。將此設定為 false
會有更好的效能。
class Comment < ActiveRecord::Base
belongs_to :post
end
Comment.where(post: post_id).count # => 5
# When `allow_deprecated_singular_associations_name` is true:
Comment.where(posts: post_id).count # => 5 (deprecation warning)
# When `allow_deprecated_singular_associations_name` is false:
Comment.where(posts: post_id).count # => error
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | true |
7.1 | false |
3.8.57 config.active_record.yaml_column_permitted_classes
預設為 [Symbol]
。允許應用程式將其他允許的類別包含到 ActiveRecord::Coders::YAMLColumn
的 safe_load()
中。
3.8.58 config.active_record.use_yaml_unsafe_load
預設為 false
。允許應用程式選擇在 ActiveRecord::Coders::YAMLColumn
上使用 unsafe_load
。
3.8.59 config.active_record.raise_int_wider_than_64bit
預設為 true
。決定在 PostgreSQL 轉接器提供一個比有號 64 位元表示還要寬的整數時,是否引發例外狀況。
3.8.60 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.61 ActiveRecord::ConnectionAdapters::Mysql2Adapter.emulate_booleans
和 ActiveRecord::ConnectionAdapters::TrilogyAdapter.emulate_booleans
控制 Active Record MySQL 轉接器是否將所有 tinyint(1)
欄位視為布林值。預設為 true
。
3.8.62 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.63 ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.datetime_type
控制在遷移或架構中呼叫 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.64 ActiveRecord::SchemaDumper.ignore_tables
接受不應包含在任何已產生架構檔案中的表格陣列。
3.8.65 ActiveRecord::SchemaDumper.fk_ignore_pattern
允許設定不同的正規表示法,用於決定是否將外來金鑰的名稱傾印到 db/schema.rb。預設情況下,以 fk_rails_
開頭的外來金鑰名稱不會匯出到資料庫架構傾印中。預設為 /^fk_rails_[0-9a-f]{10}$/
。
3.8.66 config.active_record.encryption.add_to_filter_parameters
啟用在 inspect
上自動過濾加密的屬性。
預設值為 true
。
3.8.67 config.active_record.encryption.hash_digest_class
設定 Active Record 加密使用的摘要演算法。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | OpenSSL::Digest::SHA1 |
7.1 | OpenSSL::Digest::SHA256 |
3.8.68 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.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 令牌是否僅對其所產生之方法/動作有效。
預設值取決於 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
當控制器中缺少 callback 的 :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
。如果允許開放式重新導向,則可以將 allow_other_host: true
新增到 redirect_to
的呼叫中。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
7.0 | true |
3.9.18 config.action_controller.log_query_tags_around_actions
決定是否會透過 around_filter
自動更新查詢標籤的控制器內容。預設值為 true
。
3.9.19 config.action_controller.wrap_parameters_by_default
在 Rails 7.0 之前,會產生新的應用程式,其中包含名為 wrap_parameters.rb
的初始化程式,用於在 ActionController::Base
中針對 JSON 要求啟用參數包裝。
將此組態值設定為 true
會產生與初始化程式相同的行為,允許應用程式移除初始化程式(如果他們不想自訂參數包裝行為)。
不論此值為何,應用程式都可以繼續在初始化程式或每個控制器中自訂參數包裝行為,就像以前一樣。
請參閱 ParamsWrapper
以取得有關參數包裝的更多資訊。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
7.0 | true |
3.9.20 ActionController::Base.wrap_parameters
組態 ParamsWrapper
。這可以在頂層或個別控制器中呼叫。
3.9.21 config.action_controller.allow_deprecated_parameters_hash_equality
控制 ActionController::Parameters#==
與 Hash
參數的行為。設定值決定 ActionController::Parameters
執行個體是否等於等效的 Hash
。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | true |
7.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.ignore_accept_header
用於決定是否忽略請求中的接受標頭。預設為 false
。
3.10.7 config.action_dispatch.x_sendfile_header
指定伺服器特定的 X-Sendfile 標頭。這對於從伺服器加速傳送檔案很有用。例如,它可以設定為 Apache 的「X-Sendfile」。
3.10.8 config.action_dispatch.http_auth_salt
設定 HTTP 驗證的雜湊值。預設為 'http authentication'
。
3.10.9 config.action_dispatch.signed_cookie_salt
設定簽署 Cookie 的 salt 值。預設為 'signed cookie'
。
3.10.10 config.action_dispatch.encrypted_cookie_salt
設定加密 Cookie 的 salt 值。預設為 'encrypted cookie'
。
3.10.11 config.action_dispatch.encrypted_signed_cookie_salt
設定簽署加密 Cookie 的 salt 值。預設為 'signed encrypted cookie'
。
3.10.12 config.action_dispatch.authenticated_encrypted_cookie_salt
設定驗證加密 Cookie 的 salt。預設為 'authenticated encrypted cookie'
。
3.10.13 config.action_dispatch.encrypted_cookie_cipher
設定用於加密 Cookie 的 cipher。預設為 "aes-256-gcm"
。
3.10.14 config.action_dispatch.signed_cookie_digest
設定用於簽署 Cookie 的摘要。預設為 "SHA1"
。
3.10.15 config.action_dispatch.cookies_rotations
允許替換加密和簽署 Cookie 的密碼、cipher 和摘要。
3.10.16 config.action_dispatch.use_authenticated_cookie_encryption
控制簽署和加密的 Cookie 使用 AES-256-GCM cipher 或較舊的 AES-256-CBC cipher。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
5.2 | true |
3.10.17 config.action_dispatch.use_cookies_with_metadata
啟用寫入嵌入目的資料的 Cookie。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
6.0 | true |
3.10.18 config.action_dispatch.perform_deep_munge
設定是否應對參數執行 deep_munge
方法。有關更多資訊,請參閱 安全性指南。預設為 true
。
3.10.19 config.action_dispatch.rescue_responses
設定哪些例外狀況會指定給 HTTP 狀態。它接受一個雜湊,您可以指定例外狀況/狀態對。
# It's good to use #[]= or #merge! to respect the default values
config.action_dispatch.rescue_responses['MyAuthenticationError'] = :unauthorized
使用 ActionDispatch::ExceptionWrapper.rescue_responses
觀察設定。預設定義如下
{
'ActionController::RoutingError' => :not_found,
'AbstractController::ActionNotFound' => :not_found,
'ActionController::MethodNotAllowed' => :method_not_allowed,
'ActionController::UnknownHttpMethod' => :method_not_allowed,
'ActionController::NotImplemented' => :not_implemented,
'ActionController::UnknownFormat' => :not_acceptable,
'ActionDispatch::Http::MimeNegotiation::InvalidType' => :not_acceptable,
'ActionController::MissingExactTemplate' => :not_acceptable,
'ActionController::InvalidAuthenticityToken' => :unprocessable_entity,
'ActionController::InvalidCrossOriginRequest' => :unprocessable_entity,
'ActionDispatch::Http::Parameters::ParseError' => :bad_request,
'ActionController::BadRequest' => :bad_request,
'ActionController::ParameterMissing' => :bad_request,
'Rack::QueryParser::ParameterTypeError' => :bad_request,
'Rack::QueryParser::InvalidParameterError' => :bad_request,
'ActiveRecord::RecordNotFound' => :not_found,
'ActiveRecord::StaleObjectError' => :conflict,
'ActiveRecord::RecordInvalid' => :unprocessable_entity,
'ActiveRecord::RecordNotSaved' => :unprocessable_entity
}
未設定的任何例外狀況都將對應到 500 內部伺服器錯誤。
3.10.20 config.action_dispatch.cookies_same_site_protection
設定設定 Cookie 時 SameSite
屬性的預設值。設定為 nil
時,不會新增 SameSite
屬性。若要允許根據要求動態設定 SameSite
屬性的值,可以指定一個程序。例如
config.action_dispatch.cookies_same_site_protection = ->(request) do
:strict unless request.user_agent == "TestAgent"
end
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | nil |
6.1 | :lax |
3.10.21 config.action_dispatch.ssl_default_redirect_status
設定在 ActionDispatch::SSL
中介軟體中,將非 GET/HEAD 要求從 HTTP 重新導向到 HTTPS 時,使用的預設 HTTP 狀態碼。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | 307 |
6.1 | 308 |
3.10.22 config.action_dispatch.log_rescued_responses
啟用記錄在 rescue_responses
中設定的那些未處理例外。預設為 true
。
3.10.23 config.action_dispatch.show_exceptions
config.action_dispatch.show_exceptions
設定控制 Action Pack(特別是 ActionDispatch::ShowExceptions
中介軟體)如何處理在回應要求時引發的例外。
將值設定為 :all
或 true
,會設定 Action Pack 從例外中救援並呈現對應的錯誤頁面。例如,Action Pack 會從 ActiveRecord::RecordNotFound
例外中救援,並以 404 Not found
狀態碼呈現 public/404.html
的內容。
將值設定為 :rescueable
,會設定 Action Pack 從在 config.action_dispatch.rescue_responses
中定義的例外中救援,並引發所有其他例外。例如,Action Pack 會從 ActiveRecord::RecordNotFound
中救援,但會引發 NoMethodError
。
將值設定為 :none
或 false
,會設定 Action Pack 引發所有例外。
:all
、true
- 為所有例外呈現錯誤頁面:rescueable
- 為由config.action_dispatch.rescue_responses
宣告的例外呈現錯誤頁面:none
、false
- 引發所有例外
從版本開始 | 預設值為 |
---|---|
(原始) | true |
7.1 | :all |
3.10.24 ActionDispatch::Callbacks.before
取得在要求之前執行的程式碼區塊。
3.10.25 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 要使用的修剪模式。預設為 '-'
,這會在使用 <%= -%>
或 <%= =%>
時開啟尾端空白和換行符號的修剪。請參閱 Erubis 文件 以取得更多資訊。
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
會根據內容傳遞的方式呈現 <button>
或 <input>
在 <form>
內部(為簡潔起見,省略 <form>
)
<%= button_to "Content", "/" %>
# => <input type="submit" value="Content">
<%= button_to "/" do %>
Content
<% end %>
# => <button type="submit">Content</button>
將此值設定為 true
會讓 button_to
在兩種情況下都在 <form>
內部產生 <button>
標籤。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
7.0 | true |
3.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 (請參閱附註) |
HTML5 |
Rails::HTML5::Sanitizer
在 JRuby 上不受支援,因此在 JRuby 平台上 Rails 會改用 Rails::HTML4::Sanitizer
。
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:SMTP over direct TLS 連線)。:open_timeout
- 嘗試開啟連線時要等待的秒數。:read_timeout
- 執行 read(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.raise_delivery_errors
指定如果無法完成電子郵件傳遞時是否要產生錯誤。預設為 true
。
3.13.7 config.action_mailer.delivery_method
定義傳遞方法,預設為 :smtp
。請參閱 Action Mailer 指南中的組態區段 以取得更多資訊。
3.13.8 config.action_mailer.perform_deliveries
指定是否實際傳遞郵件,預設為 true
。在進行測試時,將其設定為 false
會比較方便。
3.13.9 config.action_mailer.default_options
組態 Action Mailer 預設值。用於設定每個郵件傳送器的選項,例如 from
或 reply_to
。這些預設值為
{
mime_version: "1.0",
charset: "UTF-8",
content_type: "text/plain",
parts_order: ["text/plain", "text/enriched", "text/html"]
}
指定雜湊設定其他選項
config.action_mailer.default_options = {
from: "[email protected]"
}
3.13.10 config.action_mailer.observers
註冊在傳送郵件時會收到通知的觀察者。
config.action_mailer.observers = ["MailObserver"]
3.13.11 config.action_mailer.interceptors
註冊在傳送郵件前會被呼叫的攔截器。
config.action_mailer.interceptors = ["MailInterceptor"]
3.13.12 config.action_mailer.preview_interceptors
註冊在預覽郵件前會被呼叫的攔截器。
config.action_mailer.preview_interceptors = ["MyPreviewMailInterceptor"]
3.13.13 config.action_mailer.preview_paths
指定郵件預覽的位置。將路徑附加到這個組態選項會讓這些路徑用於搜尋郵件預覽。
config.action_mailer.preview_paths << "#{Rails.root}/lib/mailer_previews"
3.13.14 config.action_mailer.show_previews
啟用或停用郵件預覽。預設在開發環境中為 true
。
config.action_mailer.show_previews = false
3.13.15 config.action_mailer.perform_caching
指定郵件範本是否應執行片段快取。如果未指定,預設為 true
。
3.13.16 config.action_mailer.deliver_later_queue_name
指定用於預設傳送工作(請參閱 config.action_mailer.delivery_job
)的 Active Job 佇列。當此選項設為 nil
時,傳送工作會傳送到預設的 Active Job 佇列(請參閱 config.active_job.default_queue_name
)。
郵件類別可以覆寫此設定以使用不同的佇列。請注意,這只適用於使用預設傳送工作時。如果您的郵件使用自訂工作,則會使用其佇列。
請確保您的 Active Job 介面卡也已設定為處理指定的佇列,否則傳送工作可能會被靜默忽略。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | :mailers |
6.1 | nil |
3.13.17 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
指定要對快取使用的序列化格式。可能的值為 6.1
、7.0
和 7.1
。
7.0
以更有效率的方式序列化快取項目。
7.1
進一步提升效率,並允許在不反序列化值的情況下偵測到過期的快取項目和版本不符的快取項目。它還包含對純文字值(例如檢視片段)的最佳化。
所有格式都具有向後和向前相容性,這表示使用一種格式寫入的快取項目可以在使用另一種格式時讀取。此行為讓在格式之間進行移轉變得容易,而不會使整個快取失效。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | 6.1 |
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/environments
檔案中,這會設定為開發環境和測試環境的 :raise
,而生產環境會省略,改用 config.active_support.report_deprecations
。
3.14.14 config.active_support.disallowed_deprecation_warnings
設定應用程式視為不允許的過時警告。這允許將特定的過時視為嚴重錯誤。
3.14.15 config.active_support.report_deprecations
當為 false
時,會停用所有過時警告,包括不允許的過時,來自 應用程式的過時。這包括 Rails 和其他寶石的所有過時,這些寶石可能會將它們的過時加入到過時集合中,但可能無法防止從 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.to_time_preserves_timezone
指定 to_time
方法是否保留其接收者的 UTC 位移。如果為 false
,to_time
方法將轉換為本機系統 UTC 位移。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
5.0 | true |
3.14.21 ActiveSupport.utc_to_local_returns_utc_offset_times
設定 ActiveSupport::TimeZone.utc_to_local
以傳回具有 UTC 位移的時間,而不是包含該位移的 UTC 時間。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
6.1 | true |
3.14.22 config.active_support.raise_on_invalid_cache_expiration_time
指定如果 Rails.cache
fetch
或 write
給定無效的 expires_at
或 expires_in
時間,是否應引發 ArgumentError
。
選項為 true
和 false
。如果為 false
,例外將報告為 已處理
並記錄下來。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
7.1 | true |
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
指定是否應在相關排入佇列記錄行下方記錄排入背景工作的 method 的來源位置。預設情況下,此標記在開發環境中為 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.15.11 config.active_job.use_big_decimal_serializer
啟用新的 BigDecimal
參數序列化器,可保證往返。沒有此序列化器,某些佇列適配器可能會將 BigDecimal
參數序列化為簡單(不可往返)字串。
在部署具有多個複本的應用程式時,舊的(Rails 7.1 之前的)複本將無法從此序列化器取消序列化 BigDecimal
參數。因此,此設定應僅在所有複本都已成功升級到 Rails 7.1 之後才啟用。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
7.1 | 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,以不將 Action Cable 掛載為正常 Rails 伺服器的部分。
您可以在 Action Cable Overview 中找到更詳細的設定選項。
3.16.3 config.action_cable.precompile_assets
決定是否應將 Action Cable 資產新增到資產管線預編譯。如果未使用 Sprockets,則不會產生任何效果。預設值為 true
。
3.17 設定 Active Storage
config.active_storage
提供下列設定選項
3.17.1 config.active_storage.variant_processor
接受符號 :mini_magick
或 :vips
,指定變異轉換和 blob 分析將使用 MiniMagick 或 ruby-vips 執行。
預設值取決於 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 的長度和位元率。
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
接受一個字串陣列,視為網路影像內容類型,其中變體可以在不轉換為 PNG 格式的情況下處理。如果你想在應用程式中使用 WebP
或 AVIF
變體,你可以將 image/webp
或 image/avif
加入這個陣列。預設定義為
config.active_storage.web_image_content_types = %w(image/png image/jpeg image/gif)
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/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.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.11 config.active_storage.queues.mirror
接受一個符號,表示要使用於直接上傳鏡像作業的 Active Job 佇列。當此選項為 nil
時,鏡像作業會傳送至預設的 Active Job 佇列(請參閱 config.active_job.default_queue_name
)。預設為 nil
。
3.17.12 config.active_storage.logger
可用於設定 Active Storage 使用的記錄器。接受符合 Log4r 介面或預設 Ruby Logger 類別的記錄器。
config.active_storage.logger = ActiveSupport::Logger.new(STDOUT)
3.17.13 config.active_storage.service_urls_expire_in
決定由下列項目產生的 URL 的預設到期時間:
ActiveStorage::Blob#url
ActiveStorage::Blob#service_url_for_direct_upload
ActiveStorage::Preview#url
ActiveStorage::Variant#url
預設為 5 分鐘。
3.17.14 config.active_storage.urls_expire_in
決定 Active Storage 產生的 Rails 應用程式中 URL 的預設到期時間。預設為 nil。
3.17.15 config.active_storage.routes_prefix
可用於設定 Active Storage 提供的路由的路由前綴。接受一個字串,會加在產生的路由之前。
config.active_storage.routes_prefix = '/files'
預設為 /rails/active_storage
。
3.17.16 config.active_storage.track_variants
決定是否將變體記錄在資料庫中。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
6.1 | true |
3.17.17 config.active_storage.draw_routes
可用於切換 Active Storage 路由產生。預設為 true
。
3.17.18 config.active_storage.resolve_model_to_route
可變更 Active Storage 檔案的傳遞方式。
允許的值為
:rails_storage_redirect
:重新導向至已簽署的短暫服務 URL。:rails_storage_proxy
:透過下載檔案來代理檔案。
預設為 :rails_storage_redirect
。
3.17.19 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.20 config.active_storage.multiple_file_field_include_hidden
在 Rails 7.1 及更新版本中,Active Storage has_many_attached
關係預設會取代目前的集合,而非附加到集合。因此,為了支援提交空的集合,當 multiple_file_field_include_hidden
為 true
時,file_field
輔助函式會呈現一個輔助隱藏欄位,類似於 check_box
輔助函式呈現的輔助欄位。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
7.0 | true |
3.17.21 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 (請參閱附註) |
HTML5 |
Rails::HTML5::Sanitizer
在 JRuby 上不受支援,因此在 JRuby 平台上 Rails 會改用 Rails::HTML4::Sanitizer
。
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://127.0.0.1/blog_development?pool=5"
config/database.yml
檔包含 Rails 預設可以在其中執行的三個不同環境的區段
development
環境會在您手動與應用程式互動時,在您的開發/本機電腦上使用。test
環境會在執行自動化測試時使用。production
環境會在您部署應用程式供全世界使用時使用。
如果您願意,可以在 config/database.yml
內手動指定 URL
development:
url: postgresql://127.0.0.1/blog_development?pool=5
config/database.yml
檔可以包含 ERB 標籤 <%= %>
。標籤中的任何內容都將評估為 Ruby 程式碼。您可以使用它從環境變數中提取資料,或執行計算以產生所需的連線資訊。
您不必手動更新資料庫設定。如果您查看應用程式產生器的選項,您會看到其中一個選項名稱為--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://127.0.0.1/my_database
如果您有config/database.yml
但沒有ENV['DATABASE_URL']
,則此檔案將用於連線到您的資料庫
$ cat config/database.yml
development:
adapter: postgresql
database: my_database
host: localhost
$ echo $DATABASE_URL
如果您同時設定config/database.yml
和ENV['DATABASE_URL']
,則 Rails 會將設定合併在一起。為了更了解這一點,我們必須看一些範例。
當提供重複的連線資訊時,環境變數將優先
$ cat config/database.yml
development:
adapter: sqlite3
database: NOT_my_database
host: localhost
$ echo $DATABASE_URL
postgresql://127.0.0.1/my_database
$ bin/rails runner 'puts ActiveRecord::Base.configurations'
#<ActiveRecord::DatabaseConfigurations:0x00007fd50e209a28>
$ bin/rails runner 'puts ActiveRecord::Base.configurations.inspect'
#<ActiveRecord::DatabaseConfigurations:0x00007fc8eab02880 @configurations=[
#<ActiveRecord::DatabaseConfigurations::UrlConfig:0x00007fc8eab020b0
@env_name="development", @spec_name="primary",
@config={"adapter"=>"postgresql", "database"=>"my_database", "host"=>"localhost"}
@url="postgresql://127.0.0.1/my_database">
]
這裡的轉接器、主機和資料庫與ENV['DATABASE_URL']
中的資訊相符。
如果提供非重複資訊,您將取得所有唯一值,在任何衝突的情況下,環境變數仍優先。
$ cat config/database.yml
development:
adapter: sqlite3
pool: 5
$ echo $DATABASE_URL
postgresql://127.0.0.1/my_database
$ bin/rails runner 'puts ActiveRecord::Base.configurations'
#<ActiveRecord::DatabaseConfigurations:0x00007fd50e209a28>
$ bin/rails runner 'puts ActiveRecord::Base.configurations.inspect'
#<ActiveRecord::DatabaseConfigurations:0x00007fc8eab02880 @configurations=[
#<ActiveRecord::DatabaseConfigurations::UrlConfig:0x00007fc8eab020b0
@env_name="development", @spec_name="primary",
@config={"adapter"=>"postgresql", "database"=>"my_database", "host"=>"localhost", "pool"=>5}
@url="postgresql://127.0.0.1/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://127.0.0.1/my_database
$ bin/rails runner 'puts ActiveRecord::Base.configurations'
#<ActiveRecord::DatabaseConfigurations:0x00007fd50e209a28>
$ bin/rails runner 'puts ActiveRecord::Base.configurations.inspect'
#<ActiveRecord::DatabaseConfigurations:0x00007fc8eab02880 @configurations=[
#<ActiveRecord::DatabaseConfigurations::UrlConfig:0x00007fc8eab020b0
@env_name="development", @spec_name="primary",
@config={"adapter"=>"sqlite3", "database"=>"NOT_my_database"}
@url="sqlite3:NOT_my_database">
]
這裡忽略了ENV['DATABASE_URL']
中的連線資訊,請注意不同的轉接器和資料庫名稱。
由於可以在 config/database.yml
中內嵌 ERB,因此最佳做法是明確顯示您使用 ENV['DATABASE_URL']
連線至資料庫。這在製作環境中特別有用,因為您不應將機密(例如資料庫密碼)提交至您的原始碼控制(例如 Git)。
$ cat config/database.yml
production:
url: <%= ENV['DATABASE_URL'] %>
現在行為很明確,我們只使用 ENV['DATABASE_URL']
中的連線資訊。
3.20.1 設定 SQLite3 資料庫
Rails 內建支援 SQLite3,這是一個輕量級的無伺服器資料庫應用程式。雖然繁忙的製作環境可能會讓 SQLite 超載,但它很適合開發和測試。Rails 在建立新專案時預設使用 SQLite 資料庫,但您隨時可以稍後變更。
以下是預設設定檔 (config/database.yml
) 中包含開發環境連線資訊的部分
development:
adapter: sqlite3
database: storage/development.sqlite3
pool: 5
timeout: 5000
Rails 預設使用 SQLite3 資料庫來儲存資料,因為它是一個免設定的資料庫,只要執行即可。Rails 也支援 MySQL(包括 MariaDB)和 PostgreSQL「開箱即用」,並提供許多資料庫系統的外掛程式。如果您在製作環境中使用資料庫,Rails 很可能有一個適配器。
3.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
字元組,請設定您的 MySQL 伺服器以支援較長的鍵字首碼,方法是啟用 innodb_large_prefix
系統變數。
建議鎖定在 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
prepared_statements: false
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 環境和結構的資訊儲存在名為 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
,則在查詢首次嘗試時經過指定時間後,即使可以重試,也不會重試查詢。例如,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 預設附帶三個環境:「開發」、「測試」和「生產」。雖然這些環境足以應付大多數使用案例,但在某些情況下,您可能需要更多環境。
想像一下,您有一個伺服器用於反映生產環境,但僅用於測試。此類伺服器通常稱為「暫存伺服器」。若要為此伺服器定義名為「暫存」的環境,請建立一個名為 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 使用反向代理伺服器
使用反向代理伺服器部署應用程式,相較於傳統部署方式,有明顯的優點。它們讓您能透過分層應用程式所需的元件,進一步控制您的伺服器。
許多現代網路伺服器可用作代理伺服器,以平衡快取伺服器或應用程式伺服器等第三方元素。
您可以使用其中一個應用程式伺服器 Unicorn,在反向代理伺服器後方執行。
在這種情況下,您需要設定代理伺服器(NGINX、Apache 等)以接受來自您的應用程式伺服器(Unicorn)的連線。預設情況下,Unicorn 會在埠 8080 上監聽 TCP 連線,但您可以變更埠或設定它改用 socket。
您可以在 Unicorn 說明文件 中找到更多資訊,並了解其背後的 哲學。
在您設定好應用程式伺服器後,您必須適當地設定您的網路伺服器,才能將要求代理給它。例如,您的 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 使用初始化器檔案
在載入架構和應用程式中的任何寶石後,Rails 會轉為載入初始化器。初始化器是儲存在應用程式中的 config/initializers
底下的任何 Ruby 檔案。您可以使用初始化器來存放應該在載入所有架構和寶石後執行的設定,例如設定這些部分設定的選項。
config/initializers
(和 config/initializers
的任何子目錄)中的檔案會依序排序並載入,作為 load_config_initializers
初始化器的一部分。
如果某個初始化程式有依賴其他初始化程式程式碼的程式碼,你可以將它們合併成單一初始化程式。這會讓相依關係更為明確,並有助於在應用程式中浮現新概念。Rails 也支援初始化程式檔名的編號,但這可能會導致檔名變動。不建議使用 require
明確載入初始化程式,因為這會導致初始化程式載入兩次。
無法保證你的初始化程式會在所有 gem 初始化程式之後執行,因此任何依賴於特定 gem 已初始化的初始化程式碼都應該放入 config.after_initialize
區塊中。
6 個初始化事件
Rails 有 5 個初始化事件可以掛入(依執行的順序列出)
before_configuration
:這會在應用程式常數繼承自Rails::Application
時執行。config
呼叫會在執行此動作之前評估。before_initialize
:這會在應用程式的初始化程序執行前直接執行,其中:bootstrap_hook
初始化程式位於 Rails 初始化程序的開頭附近。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
區塊時尚未設定。
6.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
方法來定義應用程式的初始化器。
6.2 初始化器
以下是 Rails 中所有初始化器的完整清單,它們的順序是根據定義順序(除非另有說明,否則會依此順序執行)。
load_environment_hook
:作為佔位符,以便可以定義:load_environment_config
在其之前執行。load_active_support
:需要active_support/dependencies
,它設定了 Active Support 的基礎。如果config.active_support.bare
為非真值(這是預設值),則選擇性需要active_support/all
。initialize_logger
:初始化應用程式的記錄器(一個ActiveSupport::BroadcastLogger
物件),並使其在Rails.logger
中可用,前提是沒有在這個點之前插入的初始化器定義了Rails.logger
。initialize_cache
:如果尚未設定Rails.cache
,則透過參照config.cache_store
中的值來初始化快取,並將結果儲存在Rails.cache
中。如果這個物件回應middleware
方法,則其中間件會在中間件堆疊中插入在Rack::Runtime
之前。set_clear_dependencies_hook
:這個初始化器(僅在config.enable_reloading
設定為true
時執行)使用ActionDispatch::Callbacks.after
從物件空間中移除請求期間已參照的常數,以便在後續請求期間重新載入它們。bootstrap_hook
:執行所有已設定的before_initialize
區塊。i18n.callbacks
:在開發環境中,設定一個to_prepare
回呼,如果自上次請求以來任何區域設定已變更,它將呼叫I18n.reload!
。在生產環境中,這個回呼只會在第一次請求時執行。active_support.deprecation_behavior
:根據Rails.application.deprecators
中的config.active_support.report_deprecations
、config.active_support.deprecation
、config.active_support.disallowed_deprecation
和config.active_support.disallowed_deprecation_warnings
設定,設定折舊回報行為。active_support.initialize_time_zone
:根據config.time_zone
設定(預設為「UTC」)設定應用程式的預設時區。active_support.initialize_beginning_of_week
:根據config.beginning_of_week
設定(預設為:monday
)設定應用程式的預設週開始日。active_support.set_configs
:透過將方法名稱作為設定函式傳送至ActiveSupport
,並傳遞值,使用config.active_support
中的設定設定 Active Support。action_dispatch.configure
:設定ActionDispatch::Http::URL.tld_length
,使其設定為config.action_dispatch.tld_length
的值。action_view.set_configs
:透過將方法名稱作為設定函式傳送至ActionView::Base
,並傳遞值,使用config.action_view
中的設定設定 Action View。action_controller.assets_config
:如果未明確設定,則將config.action_controller.assets_dir
初始化為應用程式的公開目錄。action_controller.set_helpers_path
:將 Action Controller 的helpers_path
設定為應用程式的helpers_path
。action_controller.parameters_config
:設定ActionController::Parameters
的強參數選項。action_controller.set_configs
:透過將方法名稱作為設定函式傳送至ActionController::Base
,並傳遞值,使用config.action_controller
中的設定設定 Action Controller。action_controller.compile_config_methods
:初始化設定中指定的 config 方法,以加快存取速度。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.warn_on_records_fetched_greater_than
:在查詢傳回大量記錄時啟用警告。active_record.set_configs
:使用config.active_record
中的設定設定 Active Record,方法是將方法名稱作為設定函式傳送給ActiveRecord::Base
,並傳遞值。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
中的設定設定 Active Job,方法是將方法名稱作為設定函式傳送給ActiveJob::Base
,並傳遞值。action_mailer.logger
:將ActionMailer::Base.logger
(如果尚未設定)設為Rails.logger
。action_mailer.set_configs
:使用config.action_mailer
中的設定設定 Action Mailer,方法是將方法名稱作為設定函式傳送給ActionMailer::Base
,並傳遞值。action_mailer.compile_config_methods
:初始化設定中指定的 config 方法,以加快存取速度。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
,則停用自動相依性載入。
7 資料庫連線池
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
選項來增加連線池大小。
如果您在多執行緒環境中執行,可能有機會有多個執行緒同時存取多個連線。因此,根據您目前的請求負載,您很可能有多個執行緒爭用有限數量的連線。
8 自訂組態
您可以透過 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 }
9 搜尋引擎索引
有時,您可能希望防止應用程式的某些頁面在 Google、Bing、Yahoo 或 Duck Duck Go 等搜尋網站上顯示。索引這些網站的機器人會先分析 http://your-site.com/robots.txt
檔案,以了解它被允許索引哪些頁面。
Rails 會在 /public
資料夾中為您建立這個檔案。預設情況下,它允許搜尋引擎索引應用程式的所有頁面。如果您想要封鎖應用程式所有頁面的索引,請使用這個
User-agent: *
Disallow: /
若要僅封鎖特定頁面,則必須使用更複雜的語法。請在 官方文件 中學習。
10 事件驅動檔案系統監視器
如果已載入 listen gem,當重新載入已啟用時,Rails 會使用事件驅動檔案系統監視器來偵測變更
group :development do
gem 'listen', '~> 3.5'
end
否則,在每個請求中,Rails 會遍歷應用程式樹狀結構,以檢查是否有任何變更。
在 Linux 和 macOS 上不需要額外的 gem,但有些 gem 是 BSD 和 Windows 所必需的。
請注意,某些設定不支援。
回饋
歡迎協助提升本指南的品質。
如果您發現任何錯字或事實錯誤,請協助我們修正。首先,您可以閱讀我們的文件貢獻部分。
您也可能會發現內容不完整或未更新。請務必為主文件新增任何遺漏的文件。請先查看Edge Guides,以確認問題是否已在主分支中修正。查看Ruby on Rails 指南準則,以了解風格和慣例。
如果您發現需要修正的地方,但無法自行修補,請開啟問題。
最後,歡迎在Ruby on Rails 官方論壇中討論任何與 Ruby on Rails 文件相關的事項。