v7.1.3.2
更多資訊請至 rubyonrails.org: 更多 Ruby on Rails

設定 Rails 應用程式

本指南涵蓋 Rails 應用程式可用的組態和初始化功能。

閱讀完本指南後,您將知道

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 預設值

3.1.2 目標版本 7.0 的預設值

3.1.3 目標版本 6.1 的預設值

3.1.4 目標版本 6.0 的預設值

3.1.5 目標版本 5.2 的預設值

3.1.6 目標版本 5.1 的預設值

3.1.7 目標版本 5.0 的預設值

3.2 Rails 一般設定

下列設定方法會在 Rails::Railtie 物件上呼叫,例如 Rails::EngineRails::Application 的子類別。

3.2.1 config.add_autoload_paths_to_load_path

說明是否必須將自動載入路徑加入 $LOAD_PATH。建議在 :zeitwerk 模式早期於 config/application.rb 中設定為 false。Zeitwerk 內部使用絕對路徑,而以 :zeitwerk 模式執行的應用程式不需要 require_dependency,因此模型、控制器、工作等不需要在 $LOAD_PATH 中。將此設定為 false 可避免 Ruby 在使用相對路徑解析 require 呼叫時檢查這些目錄,並可節省 Bootsnap 的工作和 RAM,因為它不需要為這些目錄建立索引。

預設值取決於 config.load_defaults 目標版本

從版本開始 預設值為
(原始) true
7.1 false

lib 目錄不受此旗標影響,它會永遠加入 $LOAD_PATH

3.2.2 config.after_initialize

取得一個區塊,該區塊會在 Rails 完成應用程式初始化之後執行。這包括架構本身、引擎和 config/initializers 中所有應用程式的初始化程式。請注意,此區塊為 rake 工作執行。這對於設定由其他初始化程式設定的值很有用

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

3.2.3 config.after_routes_loaded

執行 Rails 完成載入應用程式路由後執行的區塊。當路由重新載入時,此區塊也會執行。

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

3.2.4 config.allow_concurrency

控制是否應同時處理要求。僅當應用程式程式碼非執行緒安全時,才應將此設定為 false。預設為 true

3.2.5 config.asset_host

設定資產的主機。當 CDN 用於主機資產,或當您想解決瀏覽器使用不同網域別名內建的並行限制時,這會很有用。config.action_controller.asset_host 的較短版本。

3.2.6 config.assume_ssl

讓應用程式相信所有要求都透過 SSL 抵達。當透過終止 SSL 的負載平衡器進行代理時,這很有用,轉送的要求將顯示為 HTTP,而不是 HTTPS,傳送至應用程式。這會讓重新導向和 Cookie 安全性目標 HTTP,而不是 HTTPS。此中間軟體讓伺服器假設代理已終止 SSL,而且要求確實是 HTTPS。

3.2.7 config.autoflush_log

啟用立即寫入記錄檔輸出,而不是緩衝。預設為 true

3.2.8 config.autoload_lib(ignore:)

此方法會將 lib 新增至 config.autoload_pathsconfig.eager_load_paths

通常,lib 目錄有子目錄不應自動載入或急切載入。請在必要的 ignore 關鍵字參數中傳遞它們相對於 lib 的名稱。例如,

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

請在 自動載入指南 中查看更多詳細資訊。

3.2.9 config.autoload_lib_once(ignore:)

config.autoload_lib_once 方法類似於 config.autoload_lib,但它會將 lib 新增至 config.autoload_once_paths

透過呼叫 config.autoload_lib_oncelib 中的類別和模組可以自動載入,甚至從應用程式初始化程式載入,但不會重新載入。

3.2.10 config.autoload_once_paths

接受 Rails 將自動載入常數的途徑陣列,這些常數不會在每個請求中被清除。如果已啟用重新載入,則此設定相關,而這在development環境中是預設啟用的。否則,所有自動載入只會發生一次。此陣列的所有元素也必須在autoload_paths中。預設值為空陣列。

3.2.11 config.autoload_paths

接受 Rails 將自動載入常數的途徑陣列。預設值為空陣列。自Rails 6以來,不建議調整此設定。請參閱自動載入和重新載入常數

3.2.12 config.beginning_of_week

設定應用程式的預設週開始時間。接受以符號表示的有效星期(例如:monday)。

3.2.13 config.cache_classes

等同於!config.enable_reloading的舊設定。支援向後相容性。

3.2.14 config.cache_store

設定 Rails 快取要使用的快取儲存體。選項包括符號:memory_store:file_store:mem_cache_store:null_store:redis_cache_store之一,或實作快取 API 的物件。預設為:file_store。請參閱快取儲存體以取得每個儲存體的設定選項。

3.2.15 config.colorize_logging

指定記錄資訊時是否使用 ANSI 色碼。預設為true

3.2.16 config.consider_all_requests_local

是一個旗標。如果為true,則任何錯誤都會導致在 HTTP 回應中傾印詳細的除錯資訊,而Rails::Info控制器會在/rails/info/properties中顯示應用程式執行時間內容。在開發和測試環境中預設為true,在生產環境中預設為false。若要進行更細緻的控制,請將此設定為false,並在控制器中實作show_detailed_exceptions?以指定哪些請求應在發生錯誤時提供除錯資訊。

3.2.17 config.console

讓您設定在執行 bin/rails console 時將用作主控台的類別。最好在 console 區塊中執行它

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

3.2.18 config.content_security_policy_nonce_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.rbconfig/environments/#{Rails.env}.rb 中設定。

3.2.22 config.credentials.key_path

加密憑證金鑰檔案的路徑。

如果存在,預設為 config/credentials/#{Rails.env}.key,否則為 config/master.key

要讓 bin/rails credentials 指令識別此值,必須在 config/application.rbconfig/environments/#{Rails.env}.rb 中設定。

3.2.23 config.debug_exception_response_format

設定在開發環境中發生錯誤時回應中使用的格式。對於僅限 API 的應用程式預設為 :api,對於一般應用程式預設為 :default

3.2.24 config.disable_sandbox

控制是否允許某人以沙盒模式啟動主控台。這有助於避免長時間執行沙盒主控台,這可能會導致資料庫伺服器耗盡記憶體。預設為 false

3.2.25 config.dom_testing_default_html_version

控制 Action View、Action Dispatch 和 rails-dom-testing 中的測試輔助程式預設使用 HTML4 解析器還是 HTML5 解析器。

預設值取決於 config.load_defaults 目標版本

從版本開始 預設值為
(原始) :html4
7.1 :html5 (請參閱附註)

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 錯誤,這些錯誤會在用戶端傳送無效的 AcceptContent-Type 標頭時引發。預設的 ActionDispatch::PublicExceptions 應用程式會自動執行此動作,將 Content-Type 設為 text/html 並傳回 406 Not Acceptable 狀態。如果無法處理此錯誤,將導致 500 Internal Server Error

使用 Rails.application.routes RouteSet 作為例外狀況應用程式也需要這種特殊處理。它可能看起來像這樣

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

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

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

    fallback_to_html_format_if_invalid_mime_type(request)

    @exceptions_app.call(env)
  end

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

3.2.32 config.file_watcher

config.reload_classes_only_on_changetrue 時,用於偵測檔案系統中檔案更新的類別。Rails 預設會使用 ActiveSupport::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_reloadingfalse,則會忽略此選項。

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,分別需要使用 terserclosure-compileruglifieryui-compressor 寶石。

3.3.3 config.assets.gzip

一個標誌,用於啟用建立已編譯資產的 gzip 版本,以及未 gzip 的資產。預設設定為 true

3.3.4 config.assets.paths

包含用於尋找資產的路徑。將路徑附加到此設定選項,將導致在搜尋資產時使用這些路徑。

3.3.5 config.assets.precompile

允許您指定其他資產(除了 application.cssapplication.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_controllerresource_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 支援 RegexpProcIPAddr 等類型的項目。以下是使用正規表示式的範例。

# 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.enabledfalse,則會停用。如果您需要提供未命名為 index 的靜態目錄索引檔案,請設定 config.public_file_server.index_name。例如,要為目錄要求提供 main.html 而不是 index.html,請將 config.public_file_server.index_name 設為 "main"

3.5.5 ActionDispatch::Executor

允許執行緒安全程式碼重新載入。如果 config.allow_concurrencyfalse,則會停用,這會導致載入 Rack::LockRack::Lock 會用互斥鎖包住應用程式,因此一次只能由一個執行緒呼叫它。

3.5.6 ActiveSupport::Cache::Strategy::LocalCache

作為一個基本的記憶體備份快取。此快取不是執行緒安全的,並且僅用於作為單一執行緒的暫時記憶體快取。

3.5.7 Rack::Runtime

設定 X-Runtime 標頭,包含執行要求所花費的時間(以秒為單位)。

3.5.8 Rails::Rack::Logger

通知記錄檔要求已開始。要求完成後,清除所有記錄檔。

3.5.9 ActionDispatch::ShowExceptions

救援應用程式傳回的任何例外,如果要求是本機的或 config.consider_all_requests_local 設為 true,則呈現漂亮的例外頁面。如果 config.action_dispatch.show_exceptions 設為 :none,則無論如何都會引發例外。

3.5.10 ActionDispatch::RequestId

讓回應可以使用唯一的 X-Request-Id 標頭,並啟用 ActionDispatch::Request#uuid 方法。可以使用 config.action_dispatch.request_id_header 設定。

3.5.11 ActionDispatch::RemoteIp

檢查 IP 欺騙攻擊,並從要求標頭取得有效的 client_ip。可以使用 config.action_dispatch.ip_spoofing_checkconfig.action_dispatch.trusted_proxies 選項設定。

3.5.12 Rack::Sendfile

攔截主體從檔案提供服務的回應,並以伺服器特定的 X-Sendfile 標頭取代它。可以使用 config.action_dispatch.x_sendfile_header 設定。

3.5.13 ActionDispatch::Callbacks

在提供服務要求之前執行準備回呼。

3.5.14 ActionDispatch::Cookies

設定要求的 Cookie。

3.5.15 ActionDispatch::Session::CookieStore

負責將工作階段儲存在 Cookie 中。可以透過變更 config.session_store 來使用替代的 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

布林值,用於控制模型中 createupdate 操作是否進行時間戳記。預設值為 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.rbdb/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_tohas_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 區塊中的 returnbreakthrow 是否會導致提交或回滾交易。例如:

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 區塊中使用 returnbreakthrow 基本上已不建議使用。

然而,隨著 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_commitafter_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

如果未明確指定特定欄位的序列化器實作,則要使用的序列化器實作。

歷史上,serializestore 允許使用替代序列化器實作,但預設會使用 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_threadsmin_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::YAMLColumnsafe_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_booleansActiveRecord::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

設定所有檢視輔助程式是否在各處都可用,或限定在對應的控制器中。如果設定為 falseUsersHelper 方法只會對作為 UsersController 一部分而呈現的檢視可用。如果為 trueUsersHelper 方法在各處都可用。預設設定行為(當此選項未明確設定為 truefalse 時)是所有檢視輔助程式都對每個控制器可用。

3.9.5 config.action_controller.logger

接受符合 Log4r 介面或預設 Ruby Logger 類別的記錄器,然後用來記錄 Action Controller 的資訊。設定為 nil 以停用記錄。

3.9.6 config.action_controller.request_forgery_protection_token

設定 RequestForgery 的權杖參數名稱。呼叫 protect_from_forgery 預設會將它設定為 :authenticity_token

3.9.7 config.action_controller.allow_forgery_protection

啟用或停用 CSRF 保護。預設在測試環境為 false,在所有其他環境為 true

3.9.8 config.action_controller.forgery_protection_origin_check

設定是否應將 HTTP Origin 標頭與網站來源比對,作為額外的 CSRF 防護。

預設值取決於 config.load_defaults 目標版本

從版本開始 預設值為
(原始) false
5.0 true

3.9.9 config.action_controller.per_form_csrf_tokens

設定 CSRF 令牌是否僅對其所產生之方法/動作有效。

預設值取決於 config.load_defaults 目標版本

從版本開始 預設值為
(原始) false
5.0 true

3.9.10 config.action_controller.default_protect_from_forgery

決定是否在 ActionController::Base 中新增防偽保護。

預設值取決於 config.load_defaults 目標版本

從版本開始 預設值為
(原始) false
5.2 true

3.9.11 config.action_controller.relative_url_root

可告知 Rails 您正在 部署到子目錄。預設為 config.relative_url_root

3.9.12 config.action_controller.permit_all_parameters

設定所有參數預設允許大量指派。預設值為 false

3.9.13 config.action_controller.action_on_unpermitted_parameters

控制在找到未明確允許的參數時的行為。預設值在測試和開發環境為 :log,在其他情況為 false。值可以是

  • false 不採取任何動作
  • :logunpermitted_parameters.action_controller 主題上發出 ActiveSupport::Notifications.instrument 事件,並在 DEBUG 層級記錄
  • :raise 引發 ActionController::UnpermittedParameters 例外

3.9.14 config.action_controller.always_permitted_parameters

設定預設允許的允許參數清單。預設值為 ['controller', 'action']

3.9.15 config.action_controller.enable_fragment_cache_logging

決定是否以詳細格式記錄片段快取讀取和寫入,如下所示

Read fragment views/v1/2914079/v1/2914079/recordings/70182313-20160225015037000000/d0bdf2974e1ef6d31685c3b392ad0b74 (0.6ms)
Rendered messages/_message.html.erb in 1.2 ms [cache hit]
Write fragment views/v1/2914079/v1/2914079/recordings/70182313-20160225015037000000/3b4e249ac9d168c617e32e84b99218b5 (1.1ms)
Rendered recordings/threads/_thread.html.erb in 1.5 ms [cache miss]

預設設定為 false,會產生以下輸出

Rendered messages/_message.html.erb in 1.2 ms [cache hit]
Rendered recordings/threads/_thread.html.erb in 1.5 ms [cache miss]

3.9.16 config.action_controller.raise_on_missing_callback_actions

當控制器中缺少 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 目標版本

從版本開始 預設值為
(原始)
{
"X-Frame-Options" => "SAMEORIGIN",
"X-XSS-Protection" => "1; mode=block",
"X-Content-Type-Options" => "nosniff",
"X-Download-Options" => "noopen",
"X-Permitted-Cross-Domain-Policies" => "none",
"Referrer-Policy" => "strict-origin-when-cross-origin"
}
7.0
{
"X-Frame-Options" => "SAMEORIGIN",
"X-XSS-Protection" => "0",
"X-Content-Type-Options" => "nosniff",
"X-Download-Options" => "noopen",
"X-Permitted-Cross-Domain-Policies" => "none",
"Referrer-Policy" => "strict-origin-when-cross-origin"
}
7.1
{
"X-Frame-Options" => "SAMEORIGIN",
"X-XSS-Protection" => "0",
"X-Content-Type-Options" => "nosniff",
"X-Permitted-Cross-Domain-Policies" => "none",
"Referrer-Policy" => "strict-origin-when-cross-origin"
}

3.10.4 config.action_dispatch.default_charset

指定所有渲染的預設字元集。預設為 nil

3.10.5 config.action_dispatch.tld_length

設定應用程式的 TLD(頂層網域)長度。預設為 1

3.10.6 config.action_dispatch.ignore_accept_header

用於決定是否忽略請求中的接受標頭。預設為 false

3.10.7 config.action_dispatch.x_sendfile_header

指定伺服器特定的 X-Sendfile 標頭。這對於從伺服器加速傳送檔案很有用。例如,它可以設定為 Apache 的「X-Sendfile」。

3.10.8 config.action_dispatch.http_auth_salt

設定 HTTP 驗證的雜湊值。預設為 'http authentication'

設定簽署 Cookie 的 salt 值。預設為 'signed cookie'

設定加密 Cookie 的 salt 值。預設為 'encrypted cookie'

設定簽署加密 Cookie 的 salt 值。預設為 'signed encrypted cookie'

設定驗證加密 Cookie 的 salt。預設為 'authenticated encrypted cookie'

設定用於加密 Cookie 的 cipher。預設為 "aes-256-gcm"

設定用於簽署 Cookie 的摘要。預設為 "SHA1"

3.10.15 config.action_dispatch.cookies_rotations

允許替換加密和簽署 Cookie 的密碼、cipher 和摘要。

控制簽署和加密的 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 中介軟體)如何處理在回應要求時引發的例外。

將值設定為 :alltrue,會設定 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

將值設定為 :nonefalse,會設定 Action Pack 引發所有例外。

從版本開始 預設值為
(原始) 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

決定 javascript_include_tagstylesheet_link_tag 是否會產生預載資源的 Link 標頭。

預設值取決於 config.load_defaults 目標版本

從版本開始 預設值為
(原始) nil
6.1 true

3.11.18 config.action_view.button_to_generates_button_tag

當為 false 時,button_to 會根據內容傳遞的方式呈現 <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_tagbutton_to 輔助函式是否會產生以瀏覽器安全(但技術上無效)HTML 為前綴的 HTML 標籤,以確保其內容不會被任何前置未關閉標籤擷取。預設值為 false

3.11.21 config.action_view.sanitizer_vendor

透過設定 ActionView::Helpers::SanitizeHelper.sanitizer_vendor 來設定 Action View 所使用的 HTML 清理器組。預設值取決於 config.load_defaults 目標版本

從版本開始 預設值為 將標記解析為
(原始) Rails::HTML4::Sanitizer HTML4
7.1 Rails::HTML5::Sanitizer(請參閱附註) 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_NONEOpenSSL::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 預設值。用於設定每個郵件傳送器的選項,例如 fromreply_to。這些預設值為

{
  mime_version:  "1.0",
  charset:       "UTF-8",
  content_type: "text/plain",
  parts_order:  ["text/plain", "text/enriched", "text/html"]
}

指定雜湊設定其他選項

config.action_mailer.default_options = {
  from: "[email protected]"
}

3.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::MessageEncryptorActiveSupport::MessageVerifier 執行個體使用的預設序列化器。為了讓序列化器之間的遷移更為容易,提供的序列化器包含一個後備機制,以支援多種反序列化格式

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

在訊息簽署密鑰外洩的情況下,Marshal 是反序列化攻擊的潛在媒介。如果可能,請選擇不支援 Marshal 的序列化器。

:message_pack:message_pack_allow_marshal 序列化器支援將一些 JSON 不支援的 Ruby 類型進行往返傳遞,例如 Symbol。它們還可以提供更好的效能和更小的酬載大小。但是,它們需要 msgpack 這個 gem

當上述每個序列化器退回到備用反序列化格式時,它們都會發出 message_serializer_fallback.active_support 事件通知,讓您可以追蹤此類回退發生的頻率。

或者,您可以指定任何回應 dumpload 方法的序列化器物件。例如

config.active_support.message_serializer = YAML

預設值取決於 config.load_defaults 目標版本

從版本開始 預設值為
(原始) :marshal
7.1 :json_allow_marshal

3.14.10 config.active_support.use_message_serializer_for_metadata

當為 true 時,會啟用將訊息資料和元資料一起序列化的效能最佳化。這會變更訊息格式,因此以這種方式序列化的訊息無法由舊版 (< 7.1) 的 Rails 讀取。但是,無論是否啟用此最佳化,都可以讀取使用舊格式的訊息。

預設值取決於 config.load_defaults 目標版本

從版本開始 預設值為
(原始) false
7.1 true

3.14.11 config.active_support.cache_format_version

指定要對快取使用的序列化格式。可能的值為 6.17.07.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 位移。如果為 falseto_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 fetchwrite 給定無效的 expires_atexpires_in 時間,是否應引發 ArgumentError

選項為 truefalse。如果為 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]

PopplerPDFPreviewerMuPDFPreviewer 可以從 PDF blob 的第一頁產生縮圖;VideoPreviewer 從影片 blob 的相關畫面產生。

3.17.4 config.active_storage.paths

接受一個選項的雜湊,表示預覽器/分析器命令的位置。預設為 {},表示命令會在預設路徑中尋找。可以包含下列任何選項

  • :ffprobe - ffprobe 可執行檔的位置。
  • :mutool - mutool 可執行檔的位置。
  • :ffmpeg - ffmpeg 可執行檔的位置。
config.active_storage.paths[:ffprobe] = '/usr/local/bin/ffprobe'

3.17.5 config.active_storage.variable_content_types

接受一個字串陣列,表示 Active Storage 可以透過變體處理器轉換的內容類型。預設定義為

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

3.17.6 config.active_storage.web_image_content_types

接受一個字串陣列,視為網路影像內容類型,其中變體可以在不轉換為 PNG 格式的情況下處理。如果你想在應用程式中使用 WebPAVIF 變體,你可以將 image/webpimage/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 的預設到期時間:

預設為 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"

  1. 選取第一個影片畫格、加上關鍵畫格、加上符合場景變更閾值的畫格。
  2. 當沒有其他畫格符合條件時,使用第一個影片畫格作為備用選項,方法是迴圈第一個(一個或)兩個選取的畫格,然後捨棄第一個迴圈的畫格。

3.17.20 config.active_storage.multiple_file_field_include_hidden

在 Rails 7.1 及更新版本中,Active Storage has_many_attached 關係預設會取代目前的集合,而非附加到集合。因此,為了支援提交空的集合,當 multiple_file_field_include_hiddentrue 時,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.ymlENV['DATABASE_URL'],則 Rails 會將設定合併在一起。為了更了解這一點,我們必須看一些範例。

當提供重複的連線資訊時,環境變數將優先

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

$ echo $DATABASE_URL
postgresql://127.0.0.1/my_database

$ bin/rails runner 'puts ActiveRecord::Base.configurations'
#<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 中每次重新載入程式碼時執行,但在 productiontest 中只會執行一次(在開機時)。

  • before_eager_load:這會在熱切載入發生前直接執行,這是 production 環境的預設行為,但不是 development 環境的預設行為。

  • after_initialize:在應用程式初始化後執行,在執行 config/initializers 中的應用程式初始化器後執行。

若要為這些掛勾定義事件,請在 Rails::ApplicationRails::RailtieRails::Engine 子類別中使用區塊語法

module YourApp
  class Application < Rails::Application
    config.before_initialize do
      # initialization code goes here
    end
  end
end

或者,您也可以透過 Rails.application 物件上的 config 方法來執行此操作

Rails.application.config.before_initialize do
  # initialization code goes here
end

應用程式的某些部分,特別是路由,在呼叫 after_initialize 區塊時尚未設定。

6.1 Rails::Railtie#initializer

Rails 有幾個在啟動時執行的初始化器,這些初始化器都是使用 Rails::Railtieinitializer 方法定義的。以下是 Action Controller 中 set_helpers_path 初始化器的範例

initializer "action_controller.set_helpers_path" do |app|
  ActionController::Helpers.helpers_path = app.helpers_paths
end

initializer 方法接受三個引數,第一個是初始化器的名稱,第二個是選項雜湊(在此未顯示),第三個是區塊。選項雜湊中的 :before 鍵可以指定此新初始化器必須在之前執行的初始化器,而 :after 鍵將指定在此初始化器之後執行的初始化器。

使用 initializer 方法定義的初始化器將按定義順序執行,使用 :before:after 方法的初始化器除外。

只要有邏輯,您可以在鏈中的任何其他初始化器之前或之後放置您的初始化器。假設您有 4 個稱為「一」到「四」的初始化器(按順序定義),並且您定義「四」在「二」之前但在「三」之後,這沒有邏輯,Rails 將無法確定您的初始化器順序。

initializer 方法的區塊引數是應用程式本身的執行個體,因此我們可以使用 config 方法存取其上的組態,如範例中所示。

由於 Rails::Application 繼承自 Rails::Railtie(間接),因此您可以在 config/application.rb 中使用 initializer 方法來定義應用程式的初始化器。

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_deprecationsconfig.active_support.deprecationconfig.active_support.disallowed_deprecationconfig.active_support.disallowed_deprecation_warnings 設定,設定折舊回報行為。

  • active_support.initialize_time_zone:根據 config.time_zone 設定(預設為「UTC」)設定應用程式的預設時區。

  • active_support.initialize_beginning_of_week:根據 config.beginning_of_week 設定(預設為 :monday)設定應用程式的預設週開始日。

  • active_support.set_configs:透過將方法名稱作為設定函式傳送至 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::ControllerRuntimeActiveRecord::Railties::JobRuntime,它們負責將 Active Record 呼叫所花費的時間回報給記錄器。

  • active_record.set_reloader_hooks:如果將 config.enable_reloading 設為 true,則重設所有可重新載入的資料庫連線。

  • active_record.add_watchable_files:將 schema.rbstructure.sql 檔案新增至可監控檔案。

  • active_job.logger:將 ActiveJob::Base.logger(如果尚未設定)設為 Rails.logger

  • active_job.set_configs:使用 config.active_job 中的設定設定 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_pathsconfig.eager_load_pathsconfig.autoload_once_paths 指定的所有自動載入路徑。

  • set_autoload_paths:此初始化器在 bootstrap_hook 之前執行。將 app 的所有子目錄,以及 config.autoload_pathsconfig.eager_load_pathsconfig.autoload_once_paths 指定的路徑,新增至 ActiveSupport::Dependencies.autoload_paths

  • add_routing_paths:載入(預設)所有 config/routes.rb 檔案(在應用程式和 railties 中,包括引擎),並設定應用程式的路由。

  • add_locales:將 config/locales 中的檔案(來自應用程式、railties 和引擎)新增至 I18n.load_path,讓這些檔案中的翻譯可以使用。

  • add_view_paths:將應用程式、railties 和引擎中的 app/views 目錄新增至應用程式檢視檔案的查詢路徑。

  • add_mailer_preview_paths:將應用程式、railties 和引擎中的 test/mailers/previews 目錄新增至應用程式郵件預覽檔案的查詢路徑。

  • load_environment_config:此初始化器在 load_environment_hook 之前執行。載入目前環境的 config/environments 檔案。

  • prepend_helpers_path:將應用程式、railties 和引擎中的 app/helpers 目錄新增至應用程式輔助器的查詢路徑。

  • load_config_initializers:載入應用程式、railties 和引擎中的所有 config/initializers Ruby 檔案。此目錄中的檔案可用於在載入所有架構後應執行的組態設定。

  • engines_blank_point:提供初始化中的點,如果您希望在載入引擎之前執行任何動作,可以掛入。在此點之後,將執行所有 railtie 和引擎初始化程式。

  • add_generator_templates:尋找應用程式、railties 和引擎中 lib/templates 的產生器範本,並將這些範本新增至 config.generators.templates 設定中,這將使所有產生器都可以參考這些範本。

  • ensure_autoload_once_paths_as_subset:確保 config.autoload_once_paths 僅包含 config.autoload_paths 的路徑。如果包含額外的路徑,則會引發例外狀況。

  • add_to_prepare_blocks:應用程式、railtie 或引擎中每個 config.to_prepare 呼叫的區塊都會新增至 Action Dispatch 的 to_prepare 回呼,這些回呼會在開發階段中每個要求執行,或在製作階段中第一個要求之前執行。

  • add_builtin_route:如果應用程式在開發環境中執行,則會將 rails/info/properties 的路由附加到應用程式路由。此路由提供詳細資訊,例如預設 Rails 應用程式中 public/index.html 的 Rails 和 Ruby 版本。

  • build_middleware_stack:建立應用程式的中間層堆疊,傳回一個物件,該物件有一個 call 方法,它採用要求的 Rack 環境物件。

  • eager_load!:如果 config.eager_loadtrue,則執行 config.before_eager_load 掛鉤,然後呼叫 eager_load!,它將載入所有 config.eager_load_namespaces

  • finisher_hook:提供一個掛鉤,用於在應用程式初始化程序完成後,以及執行應用程式、railties 和引擎的所有 config.after_initialize 區塊後。

  • set_routes_reloader_hook:設定 Action Dispatch 使用 ActiveSupport::Callbacks.to_run 重新載入路由檔案。

  • disable_dependency_loading:如果 config.eager_load 設為 true,則停用自動相依性載入。

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 是 BSDWindows 所必需的。

請注意,某些設定不支援

回饋

歡迎協助提升本指南的品質。

如果您發現任何錯字或事實錯誤,請協助我們修正。首先,您可以閱讀我們的文件貢獻部分。

您也可能會發現內容不完整或未更新。請務必為主文件新增任何遺漏的文件。請先查看Edge Guides,以確認問題是否已在主分支中修正。查看Ruby on Rails 指南準則,以了解風格和慣例。

如果您發現需要修正的地方,但無法自行修補,請開啟問題

最後,歡迎在Ruby on Rails 官方論壇中討論任何與 Ruby on Rails 文件相關的事項。