1 初始化程式碼的位置
Rails 提供四個標準位置來放置初始化程式碼
config/application.rb
- 特定於環境的設定檔
- 初始化器
- 後初始化器
2 在 Rails 之前執行程式碼
在極少數情況下,您的應用程式需要在 Rails 本身載入之前執行一些程式碼,請將其放置在 config/application.rb
中呼叫 require "rails/all"
的上方。
3 設定 Rails 元件
一般來說,設定 Rails 的工作意味著設定 Rails 的元件,以及設定 Rails 本身。設定檔 config/application.rb
和特定於環境的設定檔(例如 config/environments/production.rb
)可讓您指定要傳遞給所有元件的各種設定。
例如,您可以將此設定新增至 config/application.rb
檔案
config.time_zone = "Central Time (US & Canada)"
這是 Rails 本身的設定。如果您想將設定傳遞給個別的 Rails 元件,您可以透過 config/application.rb
中的同一個 config
物件來完成。
config.active_record.schema_format = :ruby
Rails 將使用該特定設定來設定 Active Record。
使用公開的設定方法,而不是直接呼叫相關的類別。例如,使用 Rails.application.config.action_mailer.options
而不是 ActionMailer::Base.options
。
如果您需要直接將設定套用至類別,請在初始化器中使用延遲載入鉤子,以避免在初始化完成之前自動載入該類別。這將會中斷,因為在應用程式重新載入時,初始化期間的自動載入無法安全地重複執行。
3.1 版本化的預設值
config.load_defaults
會載入目標版本和所有先前版本的預設設定值。例如,config.load_defaults 6.1
將載入所有直到並包括 6.1 版的預設值。
以下是與每個目標版本相關聯的預設值。在值衝突的情況下,較新版本優先於較舊版本。
3.1.1 目標版本 8.0 的預設值
Regexp.timeout
:1
config.action_dispatch.strict_freshness
:true
config.active_support.to_time_preserves_timezone
::zone
3.1.2 目標版本 7.2 的預設值
config.active_record.postgresql_adapter_decode_dates
:true
config.active_record.validate_migration_timestamps
:true
config.active_storage.web_image_content_types
:%w[image/png image/jpeg image/gif image/webp]
config.yjit
:true
3.1.3 目標版本 7.1 的預設值
config.action_dispatch.debug_exception_log_level
::error
config.action_dispatch.default_headers
:{ "X-Frame-Options" => "SAMEORIGIN", "X-XSS-Protection" => "0", "X-Content-Type-Options" => "nosniff", "X-Permitted-Cross-Domain-Policies" => "none", "Referrer-Policy" => "strict-origin-when-cross-origin" }
config.action_text.sanitizer_vendor
:Rails::HTML::Sanitizer.best_supported_vendor
config.action_view.sanitizer_vendor
:Rails::HTML::Sanitizer.best_supported_vendor
config.active_record.before_committed_on_all_records
:true
config.active_record.belongs_to_required_validates_foreign_key
:false
config.active_record.default_column_serializer
:nil
config.active_record.encryption.hash_digest_class
:OpenSSL::Digest::SHA256
config.active_record.encryption.support_sha1_for_non_deterministic_encryption
:false
config.active_record.generate_secure_token_on
::initialize
config.active_record.marshalling_format_version
:7.1
config.active_record.query_log_tags_format
::sqlcommenter
config.active_record.raise_on_assign_to_attr_readonly
:true
config.active_record.run_after_transaction_callbacks_in_order_defined
:true
config.active_record.run_commit_callbacks_on_first_saved_instances_in_transaction
:false
config.active_record.sqlite3_adapter_strict_strings_by_default
:true
config.active_support.cache_format_version
:7.1
config.active_support.message_serializer
::json_allow_marshal
config.active_support.raise_on_invalid_cache_expiration_time
:true
config.active_support.use_message_serializer_for_metadata
:true
config.add_autoload_paths_to_load_path
:false
config.dom_testing_default_html_version
:defined?(Nokogiri::HTML5) ? :html5 : :html4
config.log_file_size
:100 * 1024 * 1024
config.precompile_filter_parameters
:true
3.1.4 目標版本 7.0 的預設值
config.action_controller.raise_on_open_redirects
:true
config.action_controller.wrap_parameters_by_default
:true
config.action_dispatch.cookies_serializer
::json
config.action_dispatch.default_headers
:{ "X-Frame-Options" => "SAMEORIGIN", "X-XSS-Protection" => "0", "X-Content-Type-Options" => "nosniff", "X-Download-Options" => "noopen", "X-Permitted-Cross-Domain-Policies" => "none", "Referrer-Policy" => "strict-origin-when-cross-origin" }
config.action_mailer.smtp_timeout
:5
config.action_view.apply_stylesheet_media_default
:false
config.action_view.button_to_generates_button_tag
:true
config.active_record.automatic_scope_inversing
:true
config.active_record.partial_inserts
:false
config.active_record.verify_foreign_keys_for_fixtures
:true
config.active_storage.multiple_file_field_include_hidden
:true
config.active_storage.variant_processor
::vips
config.active_storage.video_preview_arguments
:"-vf 'select=eq(n\\,0)+eq(key\\,1)+gt(scene\\,0.015),loop=loop=-1:size=2,trim=start_frame=1' -frames:v 1 -f image2"
config.active_support.cache_format_version
:7.0
config.active_support.executor_around_test_case
:true
config.active_support.hash_digest_class
:OpenSSL::Digest::SHA256
config.active_support.key_generator_hash_digest_class
:OpenSSL::Digest::SHA256
3.1.5 目標版本 6.1 的預設值
ActiveSupport.utc_to_local_returns_utc_offset_times
:true
config.action_dispatch.cookies_same_site_protection
::lax
config.action_dispatch.ssl_default_redirect_status
:308
config.action_mailbox.queues.incineration
:nil
config.action_mailbox.queues.routing
:nil
config.action_mailer.deliver_later_queue_name
:nil
config.action_view.form_with_generates_remote_forms
:false
config.action_view.preload_links_header
:true
config.active_job.retry_jitter
:0.15
config.active_record.has_many_inversing
:true
config.active_storage.queues.analysis
:nil
config.active_storage.queues.purge
:nil
config.active_storage.track_variants
:true
3.1.6 目標版本 6.0 的預設值
config.action_dispatch.use_cookies_with_metadata
:true
config.action_mailer.delivery_job
:"ActionMailer::MailDeliveryJob"
config.action_view.default_enforce_utf8
:false
config.active_record.collection_cache_versioning
:true
config.active_storage.queues.analysis
::active_storage_analysis
config.active_storage.queues.purge
::active_storage_purge
3.1.7 目標版本 5.2 的預設值
config.action_controller.default_protect_from_forgery
:true
config.action_dispatch.use_authenticated_cookie_encryption
:true
config.action_view.form_with_generates_ids
:true
config.active_record.cache_versioning
:true
config.active_support.hash_digest_class
:OpenSSL::Digest::SHA1
config.active_support.use_authenticated_message_encryption
:true
3.1.8 目標版本 5.1 的預設值
config.action_view.form_with_generates_remote_forms
:true
config.assets.unknown_asset_fallback
:false
3.1.9 目標版本 5.0 的預設值
config.action_controller.forgery_protection_origin_check
:true
config.action_controller.per_form_csrf_tokens
:true
config.active_record.belongs_to_required_by_default
:true
config.active_support.to_time_preserves_timezone
::offset
config.ssl_options
:{ hsts: { subdomains: true } }
3.2 Rails 一般設定
下列設定方法將在 Rails::Railtie
物件上呼叫,例如 Rails::Engine
或 Rails::Application
的子類別。
3.2.1 config.add_autoload_paths_to_load_path
表示是否必須將自動載入路徑新增至 $LOAD_PATH
。建議在 :zeitwerk
模式中盡早於 config/application.rb
中設定為 false
。Zeitwerk 在內部使用絕對路徑,且以 :zeitwerk
模式執行的應用程式不需要 require_dependency
,因此模型、控制器、任務等不需要位於 $LOAD_PATH
中。將此設定為 false
可避免 Ruby 在解析具有相對路徑的 require
呼叫時檢查這些目錄,並節省 Bootsnap 的工作和 RAM,因為它不需要為它們建立索引。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | true |
7.1 | false |
lib
目錄不受此標記影響,它始終會新增至 $LOAD_PATH
。
3.2.2 config.after_initialize
接受一個區塊,該區塊將在 Rails 完成應用程式初始化後執行。這包括框架本身、引擎以及 config/initializers
中所有應用程式初始化器的初始化。請注意,此區塊將針對 rake 任務執行。適用於設定由其他初始化器設定的值
config.after_initialize do
ActionView::Base.sanitized_allowed_tags.delete "div"
end
3.2.3 config.after_routes_loaded
接受一個區塊,該區塊將在 Rails 完成載入應用程式路由後執行。此區塊也會在重新載入路由時執行。
config.after_routes_loaded do
# Code that does something with Rails.application.routes
end
3.2.4 config.allow_concurrency
控制是否應並行處理請求。只有在應用程式程式碼不是執行緒安全時,才應將此設定為 false
。預設為 true
。
3.2.5 config.asset_host
設定資產的主機。當 CDN 用於託管資產時,或當您想使用不同的網域別名來解決瀏覽器中內建的並行限制時,這會很有用。config.action_controller.asset_host
的較短版本。
3.2.6 config.assume_ssl
使應用程式認為所有請求都透過 SSL 到達。當透過終止 SSL 的負載平衡器進行代理時,這會很有用,轉發的請求在應用程式看來會是 HTTP 而不是 HTTPS。這會使重新導向和 Cookie 安全性目標為 HTTP 而不是 HTTPS。此中介軟體會使伺服器假設代理已終止 SSL,且請求確實是 HTTPS。
3.2.7 config.autoflush_log
啟用立即寫入記錄檔輸出,而不是緩衝。預設為 true
。
3.2.8 config.autoload_lib(ignore:)
此方法會將 lib
新增至 config.autoload_paths
和 config.eager_load_paths
。
通常,lib
目錄有不應自動載入或預先載入的子目錄。請在所需的 ignore
關鍵字引數中,傳遞它們相對於 lib
的名稱。例如,
config.autoload_lib(ignore: %w(assets tasks generators))
請在自動載入指南中查看更多詳細資訊。
3.2.9 config.autoload_lib_once(ignore:)
方法 config.autoload_lib_once
與 config.autoload_lib
類似,不同之處在於它會將 lib
新增至 config.autoload_once_paths
。
透過呼叫 config.autoload_lib_once
,即使從應用程式初始化器,也可以自動載入 lib
中的類別和模組,但不會重新載入。
3.2.10 config.autoload_once_paths
接受路徑陣列,Rails 將從中自動載入每個請求不會抹除的常數。如果啟用重新載入,則相關,預設會在 development
環境中啟用。否則,所有自動載入只會發生一次。此陣列的所有元素也必須在 autoload_paths
中。預設為空陣列。
3.2.11 config.autoload_paths
接受路徑陣列,Rails 將從中自動載入常數。預設為空陣列。自 Rails 6 以來,不建議調整此設定。請參閱 自動載入和重新載入常數。
3.2.12 config.beginning_of_week
設定應用程式的預設週起始日。接受有效的星期幾作為符號 (例如,:monday
)。
3.2.13 config.cache_classes
相當於 !config.enable_reloading
的舊設定。支援向後相容性。
3.2.14 config.cache_store
設定要用於 Rails 快取的快取儲存區。選項包括符號 :memory_store
、:file_store
、:mem_cache_store
、:null_store
、:redis_cache_store
之一,或實作快取 API 的物件。預設為 :file_store
。請參閱快取儲存區,以瞭解每個儲存區的設定選項。
3.2.15 config.colorize_logging
指定是否在記錄資訊時使用 ANSI 顏色程式碼。預設為 true
。
3.2.16 config.consider_all_requests_local
是標記。如果為 true
,則任何錯誤都會導致詳細的偵錯資訊在 HTTP 回應中傾印,且 Rails::Info
控制器會在 /rails/info/properties
中顯示應用程式執行階段內容。在開發和測試環境中預設為 true
,在生產環境中預設為 false
。若要進行更精細的控制,請將此設定為 false
並在控制器中實作 show_detailed_exceptions?
,以指定哪些請求應提供錯誤的偵錯資訊。
3.2.17 config.console
允許您設定當您執行 bin/rails console
時將用作主控台的類別。最好在 console
區塊中執行
console do
# this block is called only when running console,
# so we can safely require pry here
require "pry"
config.console = Pry
end
3.2.18 config.content_security_policy_nonce_directives
請參閱安全性指南中的新增 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
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) |
|
7.1 | :html5 (請參閱註解) |
Nokogiri 的 HTML5 解析器在 JRuby 上不支援,因此在 JRuby 平台上,Rails 將會回退使用 :html4
。
3.2.26 config.eager_load
當設為 true
時,會預先載入所有已註冊的 config.eager_load_namespaces
。這包括你的應用程式、引擎、Rails 框架以及任何其他已註冊的命名空間。
3.2.27 config.eager_load_namespaces
註冊當 config.eager_load
設定為 true
時會預先載入的命名空間。列表中所有的命名空間都必須回應 eager_load!
方法。
3.2.28 config.eager_load_paths
接受一個路徑陣列,如果 config.eager_load
為 true,Rails 會在啟動時從這些路徑預先載入。預設值為應用程式 app
目錄中的每個資料夾。
3.2.29 config.enable_reloading
如果 config.enable_reloading
為 true,應用程式的類別和模組在每次網頁請求之間,如果發生變更會重新載入。在 development
環境中預設為 true
,在 production
環境中預設為 false
。
同時也定義了判斷式 config.reloading_enabled?
。
3.2.30 config.encoding
設定應用程式範圍的編碼。預設為 UTF-8。
3.2.31 config.exceptions_app
設定當發生例外時,由 ShowException
中介軟體呼叫的例外處理應用程式。預設為 ActionDispatch::PublicExceptions.new(Rails.public_path)
。
例外處理應用程式需要處理 ActionDispatch::Http::MimeNegotiation::InvalidType
錯誤,當用戶端傳送無效的 Accept
或 Content-Type
標頭時,會引發此錯誤。預設的 ActionDispatch::PublicExceptions
應用程式會自動執行此操作,將 Content-Type
設定為 text/html
並返回 406 Not Acceptable
狀態。未能處理此錯誤將導致 500 Internal Server Error
。
使用 Rails.application.routes
RouteSet
作為例外處理應用程式也需要這種特殊的處理。它可能看起來像這樣
# config/application.rb
config.exceptions_app = CustomExceptionsAppWrapper.new(exceptions_app: routes)
# lib/custom_exceptions_app_wrapper.rb
class CustomExceptionsAppWrapper
def initialize(exceptions_app:)
@exceptions_app = exceptions_app
end
def call(env)
request = ActionDispatch::Request.new(env)
fallback_to_html_format_if_invalid_mime_type(request)
@exceptions_app.call(env)
end
private
def fallback_to_html_format_if_invalid_mime_type(request)
request.formats
rescue ActionDispatch::Http::MimeNegotiation::InvalidType
request.set_header "CONTENT_TYPE", "text/html"
end
end
3.2.32 config.file_watcher
當 config.reload_classes_only_on_change
為 true
時,用於偵測檔案系統中檔案更新的類別。Rails 預設使用 ActiveSupport::FileUpdateChecker
,以及 ActiveSupport::EventedFileUpdateChecker
。自訂類別必須符合 ActiveSupport::FileUpdateChecker
API。
使用 ActiveSupport::EventedFileUpdateChecker
取決於 listen gem。
group :development do
gem "listen", "~> 3.5"
end
在 Linux 和 macOS 上不需要額外的 gem,但是對於 *BSD 和 Windows 則需要一些。
請注意,某些設定不受支援。
3.2.33 config.filter_parameters
用於過濾掉您不希望顯示在日誌中的參數,例如密碼或信用卡號碼。在 Active Record 物件上呼叫 #inspect
時,它也會過濾掉資料庫欄位的敏感值。預設情況下,Rails 會在 config/initializers/filter_parameter_logging.rb
中加入以下篩選器來過濾密碼。
Rails.application.config.filter_parameters += [
:passw, :email, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn, :cvv, :cvc
]
參數篩選器透過部分匹配正規表示式來工作。
3.2.34 config.filter_redirect
用於從應用程式日誌中篩選出重新導向網址。
Rails.application.config.filter_redirect += ["s3.amazonaws.com", /private-match/]
重新導向篩選器透過測試網址是否包含字串或匹配正規表示式來工作。
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
用於驗證 Host
標頭的字串、正規表示式或 IPAddr
陣列。由 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 記錄器的詳細程度。此選項對於除 production 之外的所有環境預設為 :debug
,在 production 環境中則預設為 :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
允許手動指定 Railtie/Engine 的載入順序。預設值為 [:all]
。
config.railties_order = [Blog::Engine, :main_app, :all]
3.2.49 config.rake_eager_load
當 true
時,在執行 Rake 任務時預先載入應用程式。預設為 false
。
3.2.50 config.relative_url_root
可以用來告訴 Rails 您正在部署到子目錄。預設值為 ENV['RAILS_RELATIVE_URL_ROOT']
。
3.2.51 config.reload_classes_only_on_change
僅當追蹤的檔案發生變更時,啟用或停用重新載入類別。預設情況下,追蹤自動載入路徑上的所有內容,並設定為 true
。如果 config.enable_reloading
為 false
,則會忽略此選項。
3.2.52 config.require_master_key
如果未透過 ENV["RAILS_MASTER_KEY"]
或 config/master.key
檔案提供主金鑰,則會導致應用程式無法啟動。
3.2.53 config.sandbox_by_default
當 true
時,rails console 以沙箱模式啟動。若要在非沙箱模式下啟動 rails console,必須指定 --no-sandbox
。這有助於避免意外寫入生產資料庫。預設為 false
。
3.2.54 config.secret_key_base
指定應用程式金鑰產生器輸入密碼的備用方案。建議將此設定為未設定,而是在 config/credentials.yml.enc
中指定 secret_key_base
。有關更多資訊和替代設定方法,請參閱 secret_key_base
API 文件。
3.2.55 config.server_timing
當 true
時,將 ServerTiming
中介軟體新增到中介軟體堆疊。預設為 false
,但在預設產生的 config/environments/development.rb
檔案中設定為 true
。
3.2.56 config.session_options
傳遞給 config.session_store
的其他選項。您應該使用 config.session_store
來設定此選項,而不是自行修改。
config.session_store :cookie_store, key: "_your_app_session"
config.session_options # => {key: "_your_app_session"}
3.2.57 config.session_store
指定要用於儲存會話的類別。可能的值為 :cache_store
、:cookie_store
、:mem_cache_store
、自訂儲存體或 :disabled
。:disabled
告知 Rails 不要處理會話。
此設定透過一般方法呼叫設定,而不是設定器。這允許傳遞其他選項
config.session_store :cookie_store, key: "_your_app_session"
如果自訂儲存體指定為符號,它將解析到 ActionDispatch::Session
命名空間
# use ActionDispatch::Session::MyCustomStore as the session store
config.session_store :my_custom_store
預設儲存體是以應用程式名稱作為會話金鑰的 cookie 儲存體。
3.2.58 config.silence_healthcheck_path
指定應在日誌中靜音的健康檢查的路徑。使用 Rails::Rack::SilenceRequest
來實作靜音。所有這些都是為了防止健康檢查阻塞生產日誌,特別是對於早期階段的應用程式。
config.silence_healthcheck_path = "/up"
3.2.59 config.ssl_options
ActionDispatch::SSL
中介軟體的組態選項。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | {} |
5.0 | { hsts: { subdomains: true } } |
3.2.60 config.time_zone
設定應用程式的預設時區,並啟用 Active Record 的時區感知。
3.2.61 config.x
用於輕鬆地將巢狀的自訂設定新增至應用程式組態物件
config.x.payment_processing.schedule = :daily
Rails.configuration.x.payment_processing.schedule # => :daily
請參閱 自訂設定
3.2.62 config.yjit
自 Ruby 3.3 起啟用 YJIT,以帶來大幅的效能提升。如果您部署到記憶體受限的環境,您可能需要將此設定為 false
。
從版本開始 | 預設值為 |
---|---|
(原始) | false |
7.2 | true |
3.3 設定 Assets
3.3.1 config.assets.css_compressor
定義要使用的 CSS 壓縮器。預設由 sass-rails
設定。目前唯一的替代值是 :yui
,它使用 yui-compressor
gem。
3.3.2 config.assets.js_compressor
定義要使用的 JavaScript 壓縮器。可能的值有 :terser
、:closure
、:uglifier
和 :yui
,它們分別需要使用 terser
、closure-compiler
、uglifier
或 yui-compressor
gem。
3.3.3 config.assets.gzip
一個旗標,啟用建立已壓縮的 gzip 版本 assets,以及未壓縮的 assets。預設設定為 true
。
3.3.4 config.assets.paths
包含用於尋找 assets 的路徑。將路徑附加到此設定選項,將導致這些路徑用於搜尋 assets。
3.3.5 config.assets.precompile
允許您指定額外的 assets (除了 application.css
和 application.js
),當執行 bin/rails assets:precompile
時將會預先編譯這些 assets。
3.3.6 config.assets.unknown_asset_fallback
如果您使用 sprockets-rails 3.2.0 或更新版本,則當 asset 不在管道中時,允許您修改 asset 管道的行為。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | true |
5.1 | false |
3.3.7 config.assets.prefix
定義提供 assets 的前綴。預設為 /assets
。
3.3.8 config.assets.manifest
定義 asset 預編譯器的 manifest 檔案所使用的完整路徑。預設為 public 資料夾中 config.assets.prefix
目錄下的名為 manifest-<random>.json
的檔案。
3.3.9 config.assets.digest
啟用在 asset 名稱中使用 SHA256 指紋。預設設定為 true
。
3.3.10 config.assets.debug
停用 assets 的串聯和壓縮。在 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
將關閉所服務 assets 的記錄。
3.3.14 config.assets.quiet
停用 assets 請求的記錄。在 config/environments/development.rb
中預設設定為 true
。
3.4 設定產生器
Rails 允許您使用 config.generators
方法變更使用的產生器。此方法採用一個區塊 (block)
config.generators do |g|
g.orm :active_record
g.test_framework :test_unit
end
可以在此區塊中使用的方法的完整集合如下
force_plural
允許複數化的模型名稱。預設為false
。helper
定義是否要產生 helpers。預設為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
時,要使用哪個產生器來產生 *scaffolded* 控制器。預設為:scaffold_controller
。test_framework
定義要使用哪個測試框架。預設為false
,並預設使用 minitest。template_engine
定義要使用哪個範本引擎,例如 ERB 或 Haml。預設為:erb
。apply_rubocop_autocorrect_after_generate!
在執行 Rails 產生器後套用 RuboCop 的自動修正功能。
3.5 設定中介軟體
每個 Rails 應用程式都帶有一組標準的中介軟體,在開發環境中會按此順序使用
3.5.1 ActionDispatch::HostAuthorization
防止 DNS 重新繫結和其他 Host
標頭攻擊。預設情況下,它包含在具有以下設定的開發環境中
Rails.application.config.hosts = [
IPAddr.new("0.0.0.0/0"), # All IPv4 addresses.
IPAddr.new("::/0"), # All IPv6 addresses.
"localhost", # The localhost reserved domain.
ENV["RAILS_DEVELOPMENT_HOSTS"] # Additional comma-separated hosts for development.
]
在其他環境中,Rails.application.config.hosts
是空的,並且不會執行 Host
標頭檢查。如果您想在生產環境中防範標頭攻擊,則必須手動允許允許的主機,方法如下
Rails.application.config.hosts << "product.com"
請求的主機會使用 case 運算子 (#===
) 與 hosts
項目進行檢查,這使 hosts
支援 Regexp
、Proc
和 IPAddr
等類型的項目。以下是一個使用 regexp 的範例。
# 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
,將某些請求排除在 Host Authorization 檢查之外
# 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
用於提供靜態 assets。如果 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
會將應用程式包裝在 mutex 中,使其一次只能由單一執行緒呼叫。
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
在提供請求之前執行 prepare 回呼。
3.5.14 ActionDispatch::Cookies
為請求設定 cookies。
3.5.15 ActionDispatch::Session::CookieStore
負責將 session 儲存在 cookies 中。可以使用替代中介軟體來執行此操作,方法是變更 config.session_store
。
3.5.16 ActionDispatch::Flash
設定 flash
金鑰。只有在 config.session_store
設定為值時才可用。
3.5.17 Rack::MethodOverride
如果設定了 params[:_method]
,則允許覆寫方法。此中介軟體支援 PATCH、PUT 和 DELETE HTTP 方法類型。
3.5.18 Rack::Head
為所有 HEAD 請求傳回空白主體。它會讓所有其他請求保持不變。
3.5.19 新增自訂中介軟體
除了這些常用的中介軟體之外,您可以使用 config.middleware.use
方法新增自己的中介軟體
config.middleware.use Magical::Unicorns
這會將 Magical::Unicorns
中介軟體放在堆疊的末尾。如果您想要在另一個中介軟體之前新增中介軟體,可以使用 insert_before
。
config.middleware.insert_before Rack::Head, Magical::Unicorns
或者您可以使用索引將中介軟體插入到確切位置。例如,如果您想要將 Magical::Unicorns
中介軟體插入到堆疊的頂部,您可以這樣做
config.middleware.insert_before 0, Magical::Unicorns
還有 insert_after
會在另一個中介軟體之後插入中介軟體
config.middleware.insert_after Rack::Head, Magical::Unicorns
中介軟體也可以完全換出,並替換為其他中介軟體
config.middleware.swap ActionController::Failsafe, Lifo::Failsafe
中介軟體可以從一個位置移動到另一個位置
config.middleware.move_before ActionDispatch::Flash, Magical::Unicorns
這會將 Magical::Unicorns
中介軟體移動到 ActionDispatch::Flash
之前。您也可以將其移動到之後
config.middleware.move_after ActionDispatch::Flash, Magical::Unicorns
它們也可以從堆疊中完全移除
config.middleware.delete Rack::MethodOverride
3.6 設定 i18n
所有這些設定選項都委派給 I18n
程式庫。
3.6.1 config.i18n.available_locales
定義應用程式允許的可用語言環境。預設為在語言環境檔案中找到的所有語言環境金鑰,通常在新應用程式上只有 :en
。
3.6.2 config.i18n.default_locale
設定用於 i18n 的應用程式預設語言環境。預設為 :en
。
3.6.3 config.i18n.enforce_available_locales
確保所有透過 i18n 傳遞的語言環境都必須在 available_locales
清單中宣告,當設定不可用的語言環境時,會引發 I18n::InvalidLocale
例外。預設為 true
。建議除非有強烈需求,否則不要停用此選項,因為這可以作為一種安全性措施,防止從使用者輸入設定任何無效的語言環境。
3.6.4 config.i18n.load_path
設定 Rails 用於尋找語言環境檔案的路徑。預設為 config/locales/**/*.{yml,rb}
。
3.6.5 config.i18n.raise_on_missing_translations
決定是否應針對遺失的翻譯引發錯誤。如果為 true
,則檢視和控制器會引發 I18n::MissingTranslationData
。如果為 :strict
,則模型也會引發錯誤。預設值為 false
。
3.6.6 config.i18n.fallbacks
設定遺失翻譯的回溯行為。以下是此選項的三種使用範例
您可以將此選項設定為
true
以使用預設語系作為回溯,如下所示config.i18n.fallbacks = true
或者,您可以設定一個語系陣列作為回溯,如下所示
config.i18n.fallbacks = [:tr, :en]
或者,您可以為個別語系設定不同的回溯。例如,如果您想對
:az
和:de
使用:tr
,對:da
使用:en
作為回溯,您可以這樣做,如下所示config.i18n.fallbacks = { az: :tr, da: [:de, :en] } #or config.i18n.fallbacks.map = { az: :tr, da: [:de, :en] }
3.7 設定 Active Model
3.7.1 config.active_model.i18n_customize_full_message
控制是否可以在 i18n 語系檔案中覆寫 Error#full_message
格式。預設為 false
。
當設定為 true
時,full_message
將在語系檔案的屬性和模型層級尋找格式。預設格式為 "%{attribute} %{message}"
,其中 attribute
是屬性的名稱,而 message
是特定於驗證的訊息。以下範例覆寫了所有 Person
屬性的格式,以及特定 Person
屬性 (age
) 的格式。
class Person
include ActiveModel::Validations
attr_accessor :name, :age
validates :name, :age, presence: true
end
en:
activemodel: # or activerecord:
errors:
models:
person:
# Override the format for all Person attributes:
format: "Invalid %{attribute} (%{message})"
attributes:
age:
# Override the format for the age attribute:
format: "%{message}"
blank: "Please fill in your %{attribute}"
irb> person = Person.new.tap(&:valid?)
irb> person.errors.full_messages
=> [
"Invalid Name (can't be blank)",
"Please fill in your Age"
]
irb> person.errors.messages
=> {
:name => ["can't be blank"],
:age => ["Please fill in your Age"]
}
3.8 設定 Active Record
config.active_record
包含各種設定選項
3.8.1 config.active_record.logger
接受符合 Log4r 或預設 Ruby Logger 類別介面的記錄器,然後將其傳遞給建立的任何新資料庫連線。您可以透過在 Active Record 模型類別或 Active Record 模型實例上呼叫 logger
來檢索此記錄器。設定為 nil
以停用記錄。
3.8.2 config.active_record.primary_key_prefix_type
讓您可以調整主鍵欄位的命名。預設情況下,Rails 假設主鍵欄位命名為 id
(並且不需要設定此組態選項)。還有另外兩個選擇
:table_name
會將 Customer 類別的主鍵設定為customerid
。:table_name_with_underscore
會將 Customer 類別的主鍵設定為customer_id
。
3.8.3 config.active_record.table_name_prefix
讓您可以設定一個全域字串,加在資料表名稱的前面。如果您將此設定為 northwest_
,則 Customer 類別將會尋找 northwest_customers
作為其資料表。預設值為空字串。
3.8.4 config.active_record.table_name_suffix
讓您可以設定一個全域字串,附加在資料表名稱的後面。如果您將此設定為 _northwest
,則 Customer 類別將會尋找 customers_northwest
作為其資料表。預設值為空字串。
3.8.5 config.active_record.schema_migrations_table_name
讓您可以設定一個字串,用作結構描述遷移資料表的名稱。
3.8.6 config.active_record.internal_metadata_table_name
讓您可以設定一個字串,用作內部元數據資料表的名稱。
3.8.7 config.active_record.protected_environments
讓您可以設定一個環境名稱陣列,在這些環境中應該禁止破壞性操作。
3.8.8 config.active_record.pluralize_table_names
指定 Rails 是否會在資料庫中尋找單數或複數資料表名稱。如果設定為 true
(預設值),則 Customer 類別將使用 customers
資料表。如果設定為 false
,則 Customer 類別將使用 customer
資料表。
3.8.9 config.active_record.default_timezone
決定從資料庫提取日期和時間時,是使用 Time.local
(如果設定為 :local
) 還是 Time.utc
(如果設定為 :utc
)。預設值為 :utc
。
3.8.10 config.active_record.schema_format
控制將資料庫結構描述轉儲到檔案的格式。選項為 :ruby
(預設值),用於不依賴資料庫、依賴遷移的版本,或 :sql
用於一組 (可能依賴資料庫的) SQL 語句。
3.8.11 config.active_record.error_on_ignored_order
指定在批次查詢期間忽略查詢順序時是否應該引發錯誤。選項為 true
(引發錯誤) 或 false
(警告)。預設值為 false
。
3.8.12 config.active_record.timestamped_migrations
控制遷移是以連續整數或時間戳記編號。預設值為 true
,使用時間戳記,如果有多位開發人員在同一個應用程式上工作,則最好使用時間戳記。
3.8.13 config.active_record.automatically_invert_plural_associations
控制 Active Record 是否會自動尋找具有複數名稱的反向關聯。
範例
class Post < ApplicationRecord
has_many :comments
end
class Comment < ApplicationRecord
belongs_to :post
end
在上述情況下,Active Record 過去只會在 Post
中尋找 :comment
(單數) 關聯,而不會找到。
啟用此選項後,它也會尋找 :comments
關聯。在絕大多數情況下,發現反向關聯是有利的,因為它可以防止一些無用的查詢,但它可能會導致與不期望它的舊程式碼的向後相容性問題。
此行為可以在每個模型的基礎上停用
class Comment < ApplicationRecord
self.automatically_invert_plural_associations = false
belongs_to :post
end
以及在每個關聯的基礎上停用
class Comment < ApplicationRecord
self.automatically_invert_plural_associations = true
belongs_to :post, inverse_of: nil
end
從版本開始 | 預設值為 |
---|---|
(原始) | false |
3.8.14 config.active_record.validate_migration_timestamps
控制是否驗證遷移時間戳記。設定後,如果遷移的時間戳記前綴比與目前時間相關聯的時間戳記提前一天以上,則會引發錯誤。這樣做是為了防止遷移檔案的前向日期,這可能會影響遷移產生和其他遷移命令。config.active_record.timestamped_migrations
必須設定為 true
。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
7.2 | true |
3.8.15 config.active_record.db_warnings_action
控制在 SQL 查詢產生警告時要採取的動作。以下選項可用
:ignore
- 資料庫警告將被忽略。這是預設值。:log
- 資料庫警告將透過ActiveRecord.logger
以:warn
等級記錄。:raise
- 資料庫警告將以ActiveRecord::SQLWarning
的形式引發。:report
- 資料庫警告將報告給 Rails 錯誤報告器的訂閱者。自訂 proc - 可以提供自訂 proc。它應該接受
SQLWarning
錯誤物件。例如
config.active_record.db_warnings_action = ->(warning) do # Report to custom exception reporting service Bugsnag.notify(warning.message) do |notification| notification.add_metadata(:warning_code, warning.code) notification.add_metadata(:warning_level, warning.level) end end
3.8.16 config.active_record.db_warnings_ignore
指定一個要忽略的警告代碼和訊息的允許清單,無論設定的 db_warnings_action
如何。預設行為是報告所有警告。要忽略的警告可以指定為字串或正規表示式。例如
config.active_record.db_warnings_action = :raise
# The following warnings will not be raised
config.active_record.db_warnings_ignore = [
/Invalid utf8mb4 character string/,
"An exact warning message",
"1062", # MySQL Error 1062: Duplicate entry
]
3.8.17 config.active_record.migration_strategy
控制用於在遷移中執行結構描述語句方法的策略類別。預設類別委派給連線介面卡。自訂策略應繼承自 ActiveRecord::Migration::ExecutionStrategy
,或可繼承自 DefaultStrategy
,這將保留未實作方法 的預設行為
class CustomMigrationStrategy < ActiveRecord::Migration::DefaultStrategy
def drop_table(*)
raise "Dropping tables is not supported!"
end
end
config.active_record.migration_strategy = CustomMigrationStrategy
3.8.18 config.active_record.lock_optimistically
控制 Active Record 是否使用樂觀鎖定,預設值為 true
。
3.8.19 config.active_record.cache_timestamp_format
控制快取鍵中時間戳記值的格式。預設值為 :usec
。
3.8.20 config.active_record.record_timestamps
是一個布林值,控制是否在模型的 create
和 update
操作上發生時間戳記。預設值為 true
。
3.8.21 config.active_record.partial_inserts
是一個布林值,控制在建立新記錄時是否使用部分寫入 (即,插入是否只設定與預設值不同的屬性)。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | true |
7.0 | false |
3.8.22 config.active_record.partial_updates
是一個布林值,控制在更新現有記錄時是否使用部分寫入 (即,更新是否只設定已變更的屬性)。請注意,當使用部分更新時,您也應該使用樂觀鎖定 config.active_record.lock_optimistically
,因為並行更新可能會根據可能過時的讀取狀態寫入屬性。預設值為 true
。
3.8.23 config.active_record.maintain_test_schema
是一個布林值,控制當您執行測試時,Active Record 是否應嘗試使用 db/schema.rb
(或 db/structure.sql
) 來保持測試資料庫結構描述為最新狀態。預設值為 true
。
3.8.24 config.active_record.dump_schema_after_migration
是一個旗標,控制當您執行遷移時是否應發生結構描述轉儲 (db/schema.rb
或 db/structure.sql
)。在 Rails 產生的 config/environments/production.rb
中,此旗標設定為 false
。如果未設定此組態,則預設值為 true
。
3.8.25 config.active_record.dump_schemas
控制呼叫 db:schema:dump
時將轉儲哪些資料庫結構描述。選項為 :schema_search_path
(預設值),它會轉儲 schema_search_path
中列出的任何結構描述、:all
總是轉儲所有結構描述,而不考慮 schema_search_path
或以逗號分隔的結構描述字串。
3.8.26 config.active_record.before_committed_on_all_records
在交易中的所有已註冊記錄上啟用 before_committed! 回呼。先前的行為是僅在交易中註冊了多個相同記錄的副本時,才在記錄的第一個副本上執行回呼。
從版本開始 | 預設值為 |
---|---|
(原始) | false |
7.1 | true |
3.8.27 config.active_record.belongs_to_required_by_default
是一個布林值,控制如果 belongs_to
關聯不存在,記錄是否會驗證失敗。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | nil |
5.0 | true |
3.8.28 config.active_record.belongs_to_required_validates_foreign_key
當父記錄是強制性的時,啟用僅針對父記錄相關欄位驗證存在性。先前的行為是驗證父記錄的存在性,這會在每次更新子記錄時執行額外的查詢以取得父記錄,即使父記錄沒有變更。
從版本開始 | 預設值為 |
---|---|
(原始) | true |
7.1 | false |
3.8.29 config.active_record.marshalling_format_version
當設定為 7.1
時,會使用 Marshal.dump
啟用 Active Record 實例的更有效率序列化。
這會變更序列化格式,因此以這種方式序列化的模型無法由較舊 (< 7.1) 版本的 Rails 讀取。但是,無論是否啟用此最佳化,仍然可以讀取使用舊格式的訊息。
從版本開始 | 預設值為 |
---|---|
(原始) | 6.1 |
7.1 | 7.1 |
3.8.30 config.active_record.action_on_strict_loading_violation
如果在關聯上設定了 strict_loading,則啟用引發或記錄例外狀況。預設值在所有環境中都是 :raise
。可以將其變更為 :log
,以將違規發送到記錄器,而不是引發。
3.8.31 config.active_record.strict_loading_by_default
是一個布林值,預設啟用或停用 strict_loading 模式。預設值為 false
。
3.8.32 config.active_record.strict_loading_mode
設定報告 strict loading 的模式。預設值為 :all
。可以將其變更為 :n_plus_one_only
,以僅在載入會導致 N + 1 查詢的關聯時才報告。
3.8.33 config.active_record.index_nested_attribute_errors
允許為巢狀 has_many
關聯顯示錯誤,同時顯示索引和錯誤。預設值為 false
。
3.8.34 config.active_record.use_schema_cache_dump
讓使用者可以從 db/schema_cache.yml
(由 bin/rails db:schema:cache:dump
產生) 取得結構描述快取資訊,而不必傳送查詢到資料庫以取得此資訊。預設值為 true
。
3.8.35 config.active_record.cache_versioning
指出是否要使用穩定的 #cache_key
方法,該方法伴隨著 #cache_version
方法中的變更版本。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
5.2 | true |
3.8.36 config.active_record.collection_cache_versioning
當快取物件類型為 ActiveRecord::Relation
時,透過將關聯快取鍵中易變的資訊(最大更新時間和計數)移至快取版本中,以支援快取鍵的回收,進而啟用相同快取鍵的重複使用。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
6.0 | true |
3.8.37 config.active_record.has_many_inversing
啟用在遍歷 belongs_to
到 has_many
關聯時設定反向記錄。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
6.1 | true |
3.8.38 config.active_record.automatic_scope_inversing
啟用自動推斷帶有範圍的關聯的 inverse_of
。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
7.0 | true |
3.8.39 config.active_record.destroy_association_async_job
允許指定將用於在背景銷毀相關記錄的任務。預設為 ActiveRecord::DestroyAssociationAsyncJob
。
3.8.40 config.active_record.destroy_association_async_batch_size
允許指定透過 dependent: :destroy_async
關聯選項,在背景任務中銷毀的最大記錄數。在其他條件相同的情況下,較小的批次大小將會加入更多執行時間較短的背景任務,而較大的批次大小則會加入較少執行時間較長的背景任務。此選項預設為 nil
,這將導致給定關聯的所有相依記錄在同一個背景任務中銷毀。
3.8.41 config.active_record.queues.destroy
允許指定用於銷毀任務的 Active Job 佇列。當此選項為 nil
時,清除任務將發送到預設的 Active Job 佇列(請參閱 config.active_job.default_queue_name
)。它預設為 nil
。
3.8.42 config.active_record.enumerate_columns_in_select_statements
當為 true
時,將始終在 SELECT
語句中包含欄位名稱,並避免使用萬用字元 SELECT * FROM ...
查詢。例如,在為 PostgreSQL 資料庫新增欄位時,這可以避免預先處理的語句快取錯誤。預設為 false
。
3.8.43 config.active_record.verify_foreign_keys_for_fixtures
確保在測試中載入固定裝置後,所有外鍵約束皆有效。僅 PostgreSQL 和 SQLite 支援。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
7.0 | true |
3.8.44 config.active_record.raise_on_assign_to_attr_readonly
啟用對 attr_readonly
屬性的賦值時引發例外。先前的行為允許賦值,但會靜默地不將變更持久化到資料庫中。
從版本開始 | 預設值為 |
---|---|
(原始) | false |
7.1 | true |
3.8.45 config.active_record.run_commit_callbacks_on_first_saved_instances_in_transaction
當多個 Active Record 實例在交易中變更同一筆記錄時,Rails 只會為其中一個執行 after_commit
或 after_rollback
回呼。此選項指定 Rails 如何選擇哪個實例接收回呼。
當為 true
時,交易回呼會在第一個儲存的實例上執行,即使其實例狀態可能過時。
當為 false
時,交易回呼會在具有最新實例狀態的實例上執行。這些實例的選擇方式如下:
- 一般來說,在交易中儲存給定記錄的最後一個實例上執行交易回呼。
- 有兩種例外情況:
- 如果在交易中建立記錄,然後由另一個實例更新,則
after_create_commit
回呼將會在第二個實例上執行。這取代了根據該實例的狀態而天真地執行的after_update_commit
回呼。 - 如果在交易中銷毀記錄,則
after_destroy_commit
回呼將會在最後一個銷毀的實例上觸發,即使過時的實例隨後執行了更新(這將會影響 0 行)。
- 如果在交易中建立記錄,然後由另一個實例更新,則
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | true |
7.1 | false |
3.8.46 config.active_record.default_column_serializer
若未明確指定給定欄位的序列化器實作,則使用的序列化器實作。
過去 serialize
和 store
在允許使用替代序列化器實作時,預設會使用 YAML
,但它並不是一個非常有效率的格式,如果未謹慎使用,可能會成為安全漏洞的來源。
因此,建議偏好使用更嚴格、更有限的格式進行資料庫序列化。
不幸的是,Ruby 標準函式庫中實際上沒有任何合適的預設值。 JSON
可以作為一種格式,但 json
gem 會將不支援的類型轉換為字串,這可能會導致錯誤。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | YAML |
7.1 | nil |
3.8.47 config.active_record.run_after_transaction_callbacks_in_order_defined
當為 true
時,after_commit
回呼會按照它們在模型中定義的順序執行。當為 false
時,它們會以相反的順序執行。
所有其他回呼始終按照它們在模型中定義的順序執行(除非您使用 prepend: true
)。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
7.1 | true |
3.8.48 config.active_record.query_log_tags_enabled
指定是否啟用配接器層級的查詢註解。預設為 false
。
當此設定為 true
時,資料庫預先處理的語句將會自動停用。
3.8.49 config.active_record.query_log_tags
定義一個 Array
,指定要插入 SQL 註解中的鍵/值標籤。預設為 [ :application, :controller, :action, :job ]
。可用的標籤有::application
、:controller
、:namespaced_controller
、:action
、:job
和 :source_location
。
3.8.50 config.active_record.query_log_tags_format
一個 Symbol
,指定用於標籤的格式化器。有效值為 :sqlcommenter
和 :legacy
。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | :legacy |
7.1 | :sqlcommenter |
3.8.51 config.active_record.cache_query_log_tags
指定是否啟用查詢日誌標籤的快取。對於具有大量查詢的應用程式,當請求或任務執行期間的上下文不變時,快取查詢日誌標籤可以提供效能優勢。預設為 false
。
3.8.52 config.active_record.schema_cache_ignored_tables
定義在產生架構快取時應忽略的資料表清單。它接受字串的 Array
,表示資料表名稱,或正規表示式。
3.8.53 config.active_record.verbose_query_logs
指定是否應在相關查詢下方記錄呼叫資料庫查詢的方法的來源位置。預設情況下,此標誌在開發環境中為 true
,在所有其他環境中為 false
。
3.8.54 config.active_record.sqlite3_adapter_strict_strings_by_default
指定是否應在嚴格字串模式下使用 SQLite3Adapter。使用嚴格字串模式會停用雙引號字串常值。
SQLite 在雙引號字串常值方面有一些怪癖。它首先嘗試將雙引號字串視為識別名稱,但如果它們不存在,則將它們視為字串常值。因此,輸入錯誤可能會在不知不覺中被忽略。例如,可以為不存在的欄位建立索引。有關更多詳細資訊,請參閱 SQLite 文件。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
7.1 | true |
3.8.55 config.active_record.postgresql_adapter_decode_dates
指定 PostgresqlAdapter 是否應解碼日期欄位。
ActiveRecord::Base.connection
.select_value("select '2024-01-01'::date").class #=> Date
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
7.2 | true |
3.8.56 config.active_record.async_query_executor
指定如何池化非同步查詢。
它預設為 nil
,表示停用 load_async
,而是直接在前台執行查詢。若要實際非同步執行查詢,必須將其設定為 :global_thread_pool
或 :multi_thread_pool
。
:global_thread_pool
將對應用程式連接的所有資料庫使用單一池。對於只有單一資料庫或一次只查詢一個資料庫分片的應用程式,這是首選的配置。
:multi_thread_pool
將對每個資料庫使用一個池,並且每個池的大小可以在 database.yml
中透過 max_threads
和 min_thread
屬性單獨配置。這對於定期同時查詢多個資料庫,並且需要更精確地定義最大並發性的應用程式可能很有用。
3.8.57 config.active_record.global_executor_concurrency
與 config.active_record.async_query_executor = :global_thread_pool
結合使用,定義可以同時執行多少個非同步查詢。
預設為 4
。
此數字必須根據 database.yml
中配置的資料庫連線池大小來考量。連線池應足夠大,以容納前台執行緒(即 Web 伺服器或任務工作執行緒)和背景執行緒。
對於每個程序,Rails 會建立一個使用這麼多執行緒來處理非同步查詢的全局查詢執行器。因此,池大小應至少為 thread_count + global_executor_concurrency + 1
。例如,如果您的 Web 伺服器最多有 3 個執行緒,並且 global_executor_concurrency
設定為 4,則您的池大小應至少為 8。
3.8.58 config.active_record.yaml_column_permitted_classes
預設為 [Symbol]
。允許應用程式在 ActiveRecord::Coders::YAMLColumn
上將額外的允許類別包含到 safe_load()
中。
3.8.59 config.active_record.use_yaml_unsafe_load
預設為 false
。允許應用程式選擇在 ActiveRecord::Coders::YAMLColumn
上使用 unsafe_load
。
3.8.60 config.active_record.raise_int_wider_than_64bit
預設為 true
。判斷當 PostgreSQL 配接器收到寬度大於帶符號 64 位元表示法的整數時,是否引發例外。
3.8.61 config.active_record.generate_secure_token_on
控制何時為 has_secure_token
宣告產生值。預設情況下,當模型初始化時產生值
class User < ApplicationRecord
has_secure_token
end
record = User.new
record.token # => "fwZcXX6SkJBJRogzMdciS7wf"
若 config.active_record.generate_secure_token_on = :create
,則在建立模型時產生值
# config/application.rb
config.active_record.generate_secure_token_on = :create
# app/models/user.rb
class User < ApplicationRecord
has_secure_token on: :create
end
record = User.new
record.token # => nil
record.save!
record.token # => "fwZcXX6SkJBJRogzMdciS7wf"
從版本開始 | 預設值為 |
---|---|
(原始) | :create |
7.1 | :initialize |
3.8.62 config.active_record.permanent_connection_checkout
控制 ActiveRecord::Base.connection
是否引發錯誤、發出棄用警告或兩者皆不。
ActiveRecord::Base.connection
從池中取出資料庫連線,並將其租用到請求或任務結束。這種行為在使用的執行緒或纖程比可用連線多得多的環境中可能是不希望看到的。
可以使用此配置來追蹤並消除呼叫 ActiveRecord::Base.connection
的程式碼,並將其遷移為改用 ActiveRecord::Base.with_connection
。
值可以設定為 :disallowed
、:deprecated
或 true
,以分別引發錯誤、發出棄用警告或兩者皆不。
從版本開始 | 預設值為 |
---|---|
(原始) | true |
3.8.63 config.active_record.database_cli
控制執行 rails dbconsole
時將使用哪個 CLI 工具來存取資料庫。預設情況下,將使用資料庫的標準工具(例如 PostgreSQL 的 psql
和 MySQL 的 mysql
)。此選項採用一個雜湊,指定每個資料庫系統的工具,並且可以使用陣列,在需要備用選項時使用。
# config/application.rb
config.active_record.database_cli = { postgresql: "pgcli", mysql: %w[ mycli mysql ] }
3.8.64 ActiveRecord::ConnectionAdapters::Mysql2Adapter.emulate_booleans
和 ActiveRecord::ConnectionAdapters::TrilogyAdapter.emulate_booleans
控制 Active Record MySQL 配接器是否將所有 tinyint(1)
欄位視為布林值。預設為 true
。
3.8.65 ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.create_unlogged_tables
控制 PostgreSQL 建立的資料庫資料表是否應為「未記錄」,這可以加快效能,但如果資料庫崩潰,則會增加資料遺失的風險。強烈建議您不要在生產環境中啟用此設定。在所有環境中預設為 false
。
若要為測試啟用此設定
# config/environments/test.rb
ActiveSupport.on_load(:active_record_postgresqladapter) do
self.create_unlogged_tables = true
end
3.8.66 ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.datetime_type
控制當您在遷移或架構中呼叫 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.67 ActiveRecord::SchemaDumper.ignore_tables
接受一個不應包含在任何產生的 schema 檔案中的資料表陣列。
3.8.68 ActiveRecord::SchemaDumper.fk_ignore_pattern
允許設定不同的正規表示式,該表示式將用於決定是否應將外鍵的名稱轉儲到 db/schema.rb 中。預設情況下,以 fk_rails_
開頭的外鍵名稱不會匯出到資料庫 schema 轉儲。預設值為 /^fk_rails_[0-9a-f]{10}$/
。
3.8.69 config.active_record.encryption.add_to_filter_parameters
啟用在 inspect
時自動過濾加密的屬性。
預設值為 true
。
3.8.70 config.active_record.encryption.hash_digest_class
設定 Active Record Encryption 使用的摘要演算法。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | OpenSSL::Digest::SHA1 |
7.1 | OpenSSL::Digest::SHA256 |
3.8.71 config.active_record.encryption.support_sha1_for_non_deterministic_encryption
啟用對使用 SHA-1 摘要類別加密的現有資料進行解密的支持。當 false
時,它僅支援在 config.active_record.encryption.hash_digest_class
中設定的摘要。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | true |
7.1 | false |
3.8.72 config.active_record.encryption.compressor
設定 Active Record Encryption 使用的壓縮器。預設值為 Zlib
。
您可以將此設定為回應 deflate
和 inflate
的類別,來使用您自己的壓縮器。
3.8.73 config.active_record.protocol_adapters
當使用 URL 來設定資料庫連線時,此選項提供從協定到基礎資料庫配接器的對應。例如,這表示環境可以指定 DATABASE_URL=mysql://127.0.0.1/database
,而 Rails 會將 mysql
對應到 mysql2
配接器,但應用程式也可以覆寫這些對應。
config.active_record.protocol_adapters.mysql = "trilogy"
如果找不到對應,則會將協定用作配接器名稱。
3.9 設定 Action Controller
config.action_controller
包含多個設定選項
3.9.1 config.action_controller.asset_host
設定 asset 的主機。當使用 CDN 來託管 asset 而非應用程式伺服器本身時,這很有用。如果您對 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
當回呼的 :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.10 設定 Action Dispatch
3.10.1 config.action_dispatch.cookies_serializer
指定用於 cookie 的序列化程式。接受與 config.active_support.message_serializer
相同的值,外加 :hybrid
,它是 :json_allow_marshal
的別名。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | :marshal |
7.0 | :json |
3.10.2 config.action_dispatch.debug_exception_log_level
設定當記錄請求期間未捕獲的例外時,ActionDispatch::DebugExceptions
中介軟體使用的記錄層級。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | :fatal |
7.1 | :error |
3.10.3 config.action_dispatch.default_headers
是一個雜湊,其中包含在每個回應中預設設定的 HTTP 標頭。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) |
|
7.0 |
|
7.1 |
|
3.10.4 config.action_dispatch.default_charset
指定所有渲染的預設字元集。預設值為 nil
。
3.10.5 config.action_dispatch.tld_length
設定應用程式的 TLD(頂級網域)長度。預設值為 1
。
3.10.6 config.action_dispatch.ignore_accept_header
用於決定是否忽略來自請求的 accept 標頭。預設值為 false
。
3.10.7 config.action_dispatch.x_sendfile_header
指定伺服器特定的 X-Sendfile 標頭。這對於從伺服器加速檔案傳送很有用。例如,對於 Apache,它可以設定為 'X-Sendfile'。
3.10.8 config.action_dispatch.http_auth_salt
設定 HTTP Auth salt 值。預設值為 '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 的密碼。預設值為 "aes-256-gcm"
。
3.10.14 config.action_dispatch.signed_cookie_digest
設定用於已簽署 cookie 的摘要。預設值為 "SHA1"
。
3.10.15 config.action_dispatch.cookies_rotations
允許旋轉已加密和已簽署 cookie 的密碼、密碼和摘要。
3.10.16 config.action_dispatch.use_authenticated_cookie_encryption
控制已簽署和已加密 cookie 是否使用 AES-256-GCM 密碼或較舊的 AES-256-CBC 密碼。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
5.2 | true |
3.10.17 config.action_dispatch.use_cookies_with_metadata
啟用寫入具有內嵌目的中繼資料的 cookie。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
6.0 | true |
3.10.18 config.action_dispatch.perform_deep_munge
設定是否應對參數執行 deep_munge
方法。有關詳細資訊,請參閱安全性指南。預設值為 true
。
3.10.19 config.action_dispatch.rescue_responses
設定將哪些例外狀況指派給 HTTP 狀態。它接受雜湊,您可以指定例外/狀態的配對。
# It's good to use #[]= or #merge! to respect the default values
config.action_dispatch.rescue_responses["MyAuthenticationError"] = :unauthorized
使用 ActionDispatch::ExceptionWrapper.rescue_responses
來觀察設定。預設情況下,它定義為
{
"ActionController::RoutingError" => :not_found,
"AbstractController::ActionNotFound" => :not_found,
"ActionController::MethodNotAllowed" => :method_not_allowed,
"ActionController::UnknownHttpMethod" => :method_not_allowed,
"ActionController::NotImplemented" => :not_implemented,
"ActionController::UnknownFormat" => :not_acceptable,
"ActionDispatch::Http::MimeNegotiation::InvalidType" => :not_acceptable,
"ActionController::MissingExactTemplate" => :not_acceptable,
"ActionController::InvalidAuthenticityToken" => :unprocessable_entity,
"ActionController::InvalidCrossOriginRequest" => :unprocessable_entity,
"ActionDispatch::Http::Parameters::ParseError" => :bad_request,
"ActionController::BadRequest" => :bad_request,
"ActionController::ParameterMissing" => :bad_request,
"Rack::QueryParser::ParameterTypeError" => :bad_request,
"Rack::QueryParser::InvalidParameterError" => :bad_request,
"ActiveRecord::RecordNotFound" => :not_found,
"ActiveRecord::StaleObjectError" => :conflict,
"ActiveRecord::RecordInvalid" => :unprocessable_entity,
"ActiveRecord::RecordNotSaved" => :unprocessable_entity
}
任何未設定的例外狀況都會對應到 500 內部伺服器錯誤。
3.10.20 config.action_dispatch.cookies_same_site_protection
設定設定 Cookie 時 SameSite
屬性的預設值。當設定為 nil
時,則不會加入 SameSite
屬性。若要允許根據請求動態配置 SameSite
屬性的值,可以指定一個 proc。例如:
config.action_dispatch.cookies_same_site_protection = ->(request) do
:strict unless request.user_agent == "TestAgent"
end
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | nil |
6.1 | :lax |
3.10.21 config.action_dispatch.ssl_default_redirect_status
設定在 ActionDispatch::SSL
中介軟體中,將非 GET/HEAD 請求從 HTTP 重定向到 HTTPS 時所使用的預設 HTTP 狀態碼。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | 307 |
6.1 | 308 |
3.10.22 config.action_dispatch.log_rescued_responses
啟用記錄在 rescue_responses
中設定的未處理例外。預設值為 true
。
3.10.23 config.action_dispatch.show_exceptions
config.action_dispatch.show_exceptions
設定控制 Action Pack(特別是 ActionDispatch::ShowExceptions
中介軟體)如何處理回應請求時引發的例外。
將值設定為 :all
會設定 Action Pack 捕獲例外並呈現對應的錯誤頁面。例如,Action Pack 會捕獲 ActiveRecord::RecordNotFound
例外並呈現 public/404.html
的內容,並使用 404 Not found
狀態碼。
將值設定為 :rescuable
會設定 Action Pack 捕獲在 config.action_dispatch.rescue_responses
中定義的例外,並引發所有其他例外。例如,Action Pack 會捕獲 ActiveRecord::RecordNotFound
,但會引發 NoMethodError
。
將值設定為 :none
會設定 Action Pack 引發所有例外。
:all
- 為所有例外呈現錯誤頁面:rescuable
- 為config.action_dispatch.rescue_responses
宣告的例外呈現錯誤頁面:none
- 引發所有例外
從版本開始 | 預設值為 |
---|---|
(原始) | true |
7.1 | :all |
3.11 config.action_dispatch.strict_freshness
設定當回應中同時存在 ETag
標頭和 Last-Modified
標頭時,ActionDispatch::ETag
中介軟體是否應優先使用 ETag
標頭。
如果設定為 true
,當兩個標頭都存在時,只會考慮 ETag
,如 RFC 7232 第 6 節所述。
如果設定為 false
,當兩個標頭都存在時,會檢查兩個標頭,且兩個標頭都必須匹配,才能將回應視為新鮮的。
從版本開始 | 預設值為 |
---|---|
(原始) | false |
8.0 | true |
3.11.1 config.action_dispatch.always_write_cookie
如果 Cookie 被標記為不安全,或是透過 SSL 發出請求,或是請求發送到洋蔥服務,則會在請求結束時寫入 Cookie。
如果設定為 true
,即使不符合這些條件也會寫入 Cookie。
在 development
環境中預設為 true
,在所有其他環境中預設為 false
。
3.11.2 ActionDispatch::Callbacks.before
接受在請求之前執行的程式碼區塊。
3.11.3 ActionDispatch::Callbacks.after
接受在請求之後執行的程式碼區塊。
3.12 設定 Action View
config.action_view
包含少量設定選項
3.12.1 config.action_view.cache_template_loading
控制是否在每次請求時重新載入模板。預設值為 !config.enable_reloading
。
3.12.2 config.action_view.field_error_proc
提供一個 HTML 產生器,用於顯示來自 Active Model 的錯誤。該區塊會在 Action View 模板的環境中進行評估。預設值為
Proc.new { |html_tag, instance| content_tag :div, html_tag, class: "field_with_errors" }
3.12.3 config.action_view.default_form_builder
告知 Rails 預設使用哪個表單產生器。預設值為 ActionView::Helpers::FormBuilder
。如果您希望表單產生器類別在初始化後載入(以便在開發時每次請求都重新載入),您可以將其作為 String
傳遞。
3.12.4 config.action_view.logger
接受符合 Log4r 或預設 Ruby Logger 類別介面的記錄器,然後使用該記錄器來記錄來自 Action View 的資訊。設定為 nil
以停用記錄。
3.12.5 config.action_view.erb_trim_mode
控制是否應修剪特定的 ERB 語法。預設值為 '-'
,它在使用 <%= -%>
或 <%= =%>
時啟用尾隨空格和換行符的修剪。將此設定為任何其他值將會關閉修剪支援。
3.12.6 config.action_view.frozen_string_literal
使用 # frozen_string_literal: true
magic comment 編譯 ERB 模板,使所有字串文字凍結並節省配置。設定為 true
以對所有視圖啟用它。
3.12.7 config.action_view.embed_authenticity_token_in_remote_forms
允許您為具有 remote: true
的表單設定 authenticity_token
的預設行為。預設情況下,它設定為 false
,這表示遠端表單不會包含 authenticity_token
,這在您對表單進行片段快取時很有用。遠端表單從 meta
標籤取得真實性,因此除非您支援沒有 JavaScript 的瀏覽器,否則嵌入是不必要的。在這種情況下,您可以傳遞 authenticity_token: true
作為表單選項,或者將此設定設定為 true
。
3.12.8 config.action_view.prefix_partial_path_with_controller_namespace
確定是否從命名空間控制器呈現的模板中的子目錄中查找部分。例如,考慮一個名為 Admin::ArticlesController
的控制器,它會呈現這個模板
<%= render @article %>
預設設定為 true
,它會使用 /admin/articles/_article.erb
的部分。將該值設定為 false
會呈現 /articles/_article.erb
,這與從非命名空間控制器(例如 ArticlesController
)呈現的行為相同。
3.12.9 config.action_view.automatically_disable_submit_tag
確定 submit_tag
是否應在點擊時自動停用,預設值為 true
。
3.12.10 config.action_view.debug_missing_translation
確定是否將遺失的翻譯鍵包裝在 <span>
標籤中。預設值為 true
。
3.12.11 config.action_view.form_with_generates_remote_forms
確定 form_with
是否產生遠端表單。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
5.1 | true |
6.1 | false |
3.12.12 config.action_view.form_with_generates_ids
確定 form_with
是否在輸入上產生 ID。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
5.2 | true |
3.12.13 config.action_view.default_enforce_utf8
確定是否使用隱藏標籤產生表單,以強制舊版本的 Internet Explorer 提交以 UTF-8 編碼的表單。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | true |
6.0 | false |
3.12.14 config.action_view.image_loading
為 image_tag
輔助方法呈現的 <img>
標籤指定 loading
屬性的預設值。例如,當設定為 "lazy"
時,image_tag
呈現的 <img>
標籤會包含 loading="lazy"
,這會 指示瀏覽器等到圖片接近視窗時才載入。(此值仍然可以透過將例如 loading: "eager"
傳遞給 image_tag
來覆寫每個圖片。)預設值為 nil
。
3.12.15 config.action_view.image_decoding
為 image_tag
輔助方法呈現的 <img>
標籤指定 decoding
屬性的預設值。預設值為 nil
。
3.12.16 config.action_view.annotate_rendered_view_with_filenames
確定是否用模板檔案名稱註解呈現的視圖。預設值為 false
。
3.12.17 config.action_view.preload_links_header
確定 javascript_include_tag
和 stylesheet_link_tag
是否會產生一個預載入資產的 link
標頭。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | nil |
6.1 | true |
3.12.18 config.action_view.button_to_generates_button_tag
當 false
時,button_to
會根據內容的傳遞方式,在 <form>
內呈現 <button>
或 <input>
(為了簡潔起見,省略 <form>
)
<%= button_to "Content", "/" %>
# => <input type="submit" value="Content">
<%= button_to "/" do %>
Content
<% end %>
# => <button type="submit">Content</button>
將此值設定為 true
會使 button_to
在這兩種情況下都在 <form>
內產生 <button>
標籤。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
7.0 | true |
3.12.19 config.action_view.apply_stylesheet_media_default
確定當未提供 media
屬性時,stylesheet_link_tag
是否會將 screen
呈現為 media
屬性的預設值。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | true |
7.0 | false |
3.12.20 config.action_view.prepend_content_exfiltration_prevention
確定 form_tag
和 button_to
輔助方法是否會產生以瀏覽器安全(但技術上無效)HTML 開頭的 HTML 標籤,以保證它們的內容不會被任何前面未關閉的標籤捕獲。預設值為 false
。
3.12.21 config.action_view.sanitizer_vendor
透過設定 ActionView::Helpers::SanitizeHelper.sanitizer_vendor
來設定 Action View 使用的 HTML 清理器集。預設值取決於 config.load_defaults
的目標版本
從版本開始 | 預設值為 | 它將標記解析為 |
---|---|---|
(原始) | Rails::HTML4::Sanitizer |
HTML4 |
7.1 | Rails::HTML5::Sanitizer (請參閱注意) |
HTML5 |
Rails::HTML5::Sanitizer
在 JRuby 上不受支援,因此在 JRuby 平台上,Rails 會回退到 Rails::HTML4::Sanitizer
。
3.13 設定 Action Mailbox
config.action_mailbox
提供以下設定選項
3.13.1 config.action_mailbox.logger
包含 Action Mailbox 使用的記錄器。它接受符合 Log4r 或預設 Ruby Logger 類別介面的記錄器。預設值為 Rails.logger
。
config.action_mailbox.logger = ActiveSupport::Logger.new(STDOUT)
3.13.2 config.action_mailbox.incinerate_after
接受 ActiveSupport::Duration
,指示在處理後應銷毀 ActionMailbox::InboundEmail
記錄的時間長度。預設值為 30.days
。
# Incinerate inbound emails 14 days after processing.
config.action_mailbox.incinerate_after = 14.days
3.13.3 config.action_mailbox.queues.incineration
接受一個符號,指示用於銷毀工作的 Active Job 佇列。當此選項為 nil
時,銷毀工作會傳送到預設的 Active Job 佇列(請參閱 config.active_job.default_queue_name
)。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | :action_mailbox_incineration |
6.1 | nil |
3.13.4 config.action_mailbox.queues.routing
接受一個符號,指示用於路由工作的 Active Job 佇列。當此選項為 nil
時,路由工作會傳送到預設的 Active Job 佇列(請參閱 config.active_job.default_queue_name
)。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | :action_mailbox_routing |
6.1 | nil |
3.13.5 config.action_mailbox.storage_service
接受一個符號,表示用於上傳電子郵件的 Active Storage 服務。當此選項為 nil
時,電子郵件會上傳到預設的 Active Storage 服務 (請參閱 config.active_storage.service
)。
3.14 設定 Action Mailer
在 config.action_mailer
上有許多可用的設定。
3.14.1 config.action_mailer.asset_host
設定資源的主機。當使用 CDN 來託管資源而不是應用程式伺服器本身時很有用。只有在您對 Action Controller 有不同的設定時才應使用此設定,否則請使用 config.asset_host
。
3.14.2 config.action_mailer.logger
接受一個符合 Log4r 或預設 Ruby Logger 類別介面的記錄器,然後用它來記錄來自 Action Mailer 的資訊。設定為 nil
以停用記錄。
3.14.3 config.action_mailer.smtp_settings
允許為 :smtp
傳送方法進行詳細設定。它接受一個選項雜湊,其中可以包含下列任何選項:
:address
- 允許您使用遠端郵件伺服器。只需將其從預設的 "localhost" 設定變更即可。:port
- 如果您的郵件伺服器未在 25 埠上執行,您也可以變更它。:domain
- 如果您需要指定 HELO 網域,您可以在此處執行。:user_name
- 如果您的郵件伺服器需要驗證,請在此設定中設定使用者名稱。:password
- 如果您的郵件伺服器需要驗證,請在此設定中設定密碼。:authentication
- 如果您的郵件伺服器需要驗證,您需要在此處指定驗證類型。這是一個符號,可以是:plain
、:login
、:cram_md5
其中之一。:enable_starttls
- 在連線到您的 SMTP 伺服器時使用 STARTTLS,如果伺服器不支援則會失敗。預設為false
。:enable_starttls_auto
- 偵測您的 SMTP 伺服器中是否啟用 STARTTLS,並開始使用它。預設為true
。:openssl_verify_mode
- 當使用 TLS 時,您可以設定 OpenSSL 如何檢查憑證。如果您需要驗證自我簽署和/或萬用字元憑證,這會很有用。它可以是 OpenSSL 驗證常數:none
或:peer
其中之一,或直接使用常數OpenSSL::SSL::VERIFY_NONE
或OpenSSL::SSL::VERIFY_PEER
。:ssl/:tls
- 啟用 SMTP 連線以使用 SMTP/TLS (SMTPS:透過直接 TLS 連線的 SMTP)。:open_timeout
- 嘗試開啟連線時要等待的秒數。:read_timeout
- 等待到 read(2) 呼叫逾時的秒數。
此外,也可以傳遞任何 Mail::SMTP
接受的組態選項。
3.14.4 config.action_mailer.smtp_timeout
在 2.8.0 版之前,mail
gem 並未為其 SMTP 要求設定任何預設逾時。此設定使應用程式能夠在 mail
gem 中為 :open_timeout
和 :read_timeout
設定預設值,如此要求就不會無限期卡住。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | nil |
7.0 | 5 |
3.14.5 config.action_mailer.sendmail_settings
允許為 :sendmail
傳送方法進行詳細設定。它接受一個選項雜湊,其中可以包含下列任何選項:
:location
- sendmail 可執行檔的位置。預設為/usr/sbin/sendmail
。:arguments
- 命令列引數。預設為%w[ -i ]
。
3.14.6 config.action_mailer.file_settings
設定 :file
傳送方法。它接受一個選項雜湊,其中可以包含:
:location
- 儲存檔案的位置。預設為"#{Rails.root}/tmp/mails"
。:extension
- 檔案副檔名。預設為空字串。
3.14.7 config.action_mailer.raise_delivery_errors
指定如果無法完成電子郵件傳送是否要引發錯誤。預設為 true
。
3.14.8 config.action_mailer.delivery_method
定義傳送方法,預設為 :smtp
。請參閱 Action Mailer 指南中的設定章節以取得更多資訊。
3.14.9 config.action_mailer.perform_deliveries
指定是否實際傳送郵件,預設為 true
。為了測試方便,可以將其設定為 false
。
3.14.10 config.action_mailer.default_options
設定 Action Mailer 預設值。用於為每個郵件程式設定 from
或 reply_to
等選項。這些預設為:
{
mime_version: "1.0",
charset: "UTF-8",
content_type: "text/plain",
parts_order: ["text/plain", "text/enriched", "text/html"]
}
指派一個雜湊來設定其他選項。
config.action_mailer.default_options = {
from: "noreply@example.com"
}
3.14.11 config.action_mailer.observers
註冊將在郵件傳送時收到通知的觀察器。
config.action_mailer.observers = ["MailObserver"]
3.14.12 config.action_mailer.interceptors
註冊將在郵件傳送之前呼叫的攔截器。
config.action_mailer.interceptors = ["MailInterceptor"]
3.14.13 config.action_mailer.preview_interceptors
註冊將在郵件預覽之前呼叫的攔截器。
config.action_mailer.preview_interceptors = ["MyPreviewMailInterceptor"]
3.14.14 config.action_mailer.preview_paths
指定郵件預覽的位置。將路徑附加到此設定選項會導致這些路徑用於搜尋郵件預覽。
config.action_mailer.preview_paths << "#{Rails.root}/lib/mailer_previews"
3.14.15 config.action_mailer.show_previews
啟用或停用郵件預覽。在開發環境中,預設為 true
。
config.action_mailer.show_previews = false
3.14.16 config.action_mailer.perform_caching
指定郵件程式範本是否應執行片段快取。如果未指定,預設值將為 true
。
3.14.17 config.action_mailer.deliver_later_queue_name
指定要用於預設傳送作業的 Active Job 佇列 (請參閱 config.action_mailer.delivery_job
)。當此選項設定為 nil
時,傳送作業會傳送到預設的 Active Job 佇列 (請參閱 config.active_job.default_queue_name
)。
郵件程式類別可以覆寫此設定以使用不同的佇列。請注意,這僅在使用預設傳送作業時才適用。如果您的郵件程式使用自訂作業,則會使用其佇列。
請確保您的 Active Job 配接器也已設定為處理指定的佇列,否則傳送作業可能會被無聲地忽略。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | :mailers |
6.1 | nil |
3.14.18 config.action_mailer.delivery_job
指定郵件的傳送作業。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | ActionMailer::MailDeliveryJob |
6.0 | "ActionMailer::MailDeliveryJob" |
3.15 設定 Active Support
在 Active Support 中有一些可用的設定選項:
3.15.1 config.active_support.bare
啟用或停用在啟動 Rails 時載入 active_support/all
。預設為 nil
,這表示會載入 active_support/all
。
3.15.2 config.active_support.test_order
設定執行測試案例的順序。可能的值為 :random
和 :sorted
。預設為 :random
。
3.15.3 config.active_support.escape_html_entities_in_json
啟用或停用在 JSON 序列化中逸出 HTML 實體。預設為 true
。
3.15.4 config.active_support.use_standard_json_time_format
啟用或停用將日期序列化為 ISO 8601 格式。預設為 true
。
3.15.5 config.active_support.time_precision
設定 JSON 編碼時間值的精確度。預設為 3
。
3.15.6 config.active_support.hash_digest_class
允許設定用於產生非敏感摘要的摘要類別,例如 ETag 標頭。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | OpenSSL::Digest::MD5 |
5.2 | OpenSSL::Digest::SHA1 |
7.0 | OpenSSL::Digest::SHA256 |
3.15.7 config.active_support.key_generator_hash_digest_class
允許設定用於從設定的機密基底衍生機密的摘要類別,例如用於加密 Cookie。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | OpenSSL::Digest::SHA1 |
7.0 | OpenSSL::Digest::SHA256 |
3.15.8 config.active_support.use_authenticated_message_encryption
指定是否使用 AES-256-GCM 驗證加密作為加密訊息的預設密碼,而不是 AES-256-CBC。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
5.2 | true |
3.15.9 config.active_support.message_serializer
指定 ActiveSupport::MessageEncryptor
和 ActiveSupport::MessageVerifier
實例使用的預設序列化程式。為了更容易在序列化程式之間遷移,提供的序列化程式包含回溯機制以支援多種反序列化格式。
序列化程式 | 序列化和反序列化 | 回溯反序列化 |
---|---|---|
:marshal |
Marshal |
ActiveSupport::JSON 、ActiveSupport::MessagePack |
:json |
ActiveSupport::JSON |
ActiveSupport::MessagePack |
:json_allow_marshal |
ActiveSupport::JSON |
ActiveSupport::MessagePack 、Marshal |
:message_pack |
ActiveSupport::MessagePack |
ActiveSupport::JSON |
:message_pack_allow_marshal |
ActiveSupport::MessagePack |
ActiveSupport::JSON 、Marshal |
Marshal
在訊息簽名機密外洩的情況下,是反序列化攻擊的潛在向量。如果可能,請選擇不支援 Marshal
的序列化程式。
:message_pack
和 :message_pack_allow_marshal
序列化程式支援來回傳送一些 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.15.10 config.active_support.use_message_serializer_for_metadata
當為 true
時,啟用將訊息資料和中繼資料一起序列化的效能最佳化。這會變更訊息格式,因此較舊版 (< 7.1) 的 Rails 無法讀取以此方式序列化的訊息。不過,無論是否啟用此最佳化,仍然可以讀取使用舊格式的訊息。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
7.1 | true |
3.15.11 config.active_support.cache_format_version
指定用於快取的序列化格式。可能的值為 7.0
和 7.1
。
7.0
更有效率地序列化快取項目。
7.1
進一步提高效率,並允許在不反序列化其值的情況下偵測過期和版本不符的快取項目。它還包含針對純字串值 (例如檢視片段) 的最佳化。
所有格式都向後和向前相容,這表示使用一種格式寫入的快取項目在使用另一種格式時可以讀取。這種行為可以輕鬆地在格式之間遷移,而不會使整個快取失效。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
7.0 | 7.0 |
7.1 | 7.1 |
3.15.12 config.active_support.deprecation
設定棄用警告的行為。請參閱 Deprecation::Behavior
以取得可用選項的說明。
在預設產生的 config/environments
檔案中,開發環境設定為 :log
,測試環境設定為 :stderr
,而在生產環境中則省略,以支持 config.active_support.report_deprecations
。
3.15.13 config.active_support.disallowed_deprecation
設定不允許的棄用警告的行為。請參閱 Deprecation::Behavior
以取得可用選項的說明。
在預設產生的 config/environments
檔案中,開發和測試環境都設定為 :raise
,而在生產環境中則省略,以支持 config.active_support.report_deprecations
。
3.15.14 config.active_support.disallowed_deprecation_warnings
設定應用程式視為不允許的棄用警告。例如,這允許將特定的棄用視為硬性失敗。
3.15.15 config.active_support.report_deprecations
當為 false
時,會停用來自 應用程式的棄用器的所有棄用警告,包括不允許的棄用。這包括來自 Rails 和其他可能將其棄用器新增至棄用器集合的 gem 的所有棄用,但可能無法阻止 ActiveSupport::Deprecation 發出的所有棄用警告。
在預設產生的 config/environments
檔案中,生產環境設定為 false
。
3.15.16 config.active_support.isolation_level
設定 Rails 內部大多數狀態的區域性。如果您使用基於 Fiber 的伺服器或工作處理器(例如 falcon
),則應將其設定為 :fiber
。否則,最好使用 :thread
區域性。預設為 :thread
。
3.15.17 config.active_support.executor_around_test_case
設定測試套件在測試案例周圍呼叫 Rails.application.executor.wrap
。這使得測試案例的行為更接近實際的請求或工作。一些通常在測試中禁用的功能,例如 Active Record 查詢快取和非同步查詢,將會被啟用。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
7.0 | true |
3.15.18 config.active_support.to_time_preserves_timezone
指定 to_time
方法是否保留接收器的 UTC 偏移量或時區。如果設定為 :zone
,to_time
方法將使用接收器的時區。如果設定為 :offset
,to_time
方法將使用 UTC 偏移量。如果為 false
,to_time
方法將轉換為本機系統 UTC 偏移量。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
5.0 | :offset |
8.0 | :zone |
3.15.19 ActiveSupport::Logger.silencer
設定為 false
以禁用在區塊中靜音記錄的功能。預設值為 true
。
3.15.20 ActiveSupport::Cache::Store.logger
指定快取儲存操作中使用的記錄器。
3.15.21 ActiveSupport.utc_to_local_returns_utc_offset_times
設定 ActiveSupport::TimeZone.utc_to_local
返回具有 UTC 偏移量的時間,而不是包含該偏移量的 UTC 時間。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
6.1 | true |
3.15.22 config.active_support.raise_on_invalid_cache_expiration_time
指定如果 Rails.cache
的 fetch
或 write
方法收到無效的 expires_at
或 expires_in
時間,是否應引發 ArgumentError
。
選項為 true
和 false
。如果為 false
,則該例外情況將被報告為 handled
並記錄下來。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
7.1 | true |
3.16 設定 Active Job
config.active_job
提供以下設定選項
3.16.1 config.active_job.queue_adapter
設定佇列後端的适配器。預設适配器為 :async
。有關內建适配器的最新列表,請參閱 ActiveJob::QueueAdapters API 文件。
# Be sure to have the adapter's gem in your Gemfile
# and follow the adapter's specific installation
# and deployment instructions.
config.active_job.queue_adapter = :sidekiq
3.16.2 config.active_job.default_queue_name
可用於變更預設的佇列名稱。預設為 "default"
。
config.active_job.default_queue_name = :medium_priority
3.16.3 config.active_job.queue_name_prefix
允許您為所有工作設定一個可選的、非空白的佇列名稱前綴。預設情況下,它是空白且不使用的。
以下設定會在生產環境中執行時,將給定的工作排在 production_high_priority
佇列上
config.active_job.queue_name_prefix = Rails.env
class GuestsCleanupJob < ActiveJob::Base
queue_as :high_priority
#....
end
3.16.4 config.active_job.queue_name_delimiter
預設值為 '_'
。如果設定了 queue_name_prefix
,則 queue_name_delimiter
會將前綴和非前綴的佇列名稱連接起來。
以下設定會在 video_server.low_priority
佇列上排入提供的工作
# prefix must be set for delimiter to be used
config.active_job.queue_name_prefix = "video_server"
config.active_job.queue_name_delimiter = "."
class EncoderJob < ActiveJob::Base
queue_as :low_priority
#....
end
3.16.5 config.active_job.logger
接受符合 Log4r 介面或預設 Ruby Logger 類別的記錄器,然後用於記錄來自 Active Job 的資訊。您可以透過在 Active Job 類別或 Active Job 實例上呼叫 logger
來檢索此記錄器。設定為 nil
以停用記錄。
3.16.6 config.active_job.custom_serializers
允許設定自訂的參數序列化器。預設為 []
。
3.16.7 config.active_job.log_arguments
控制是否記錄工作的參數。預設為 true
。
3.16.8 config.active_job.verbose_enqueue_logs
指定是否應在相關的入隊記錄行下方記錄入隊背景方法的原始碼位置。預設情況下,此標誌在開發環境中為 true
,在所有其他環境中為 false
。
3.16.9 config.active_job.retry_jitter
控制在重試失敗的工作時,應用於計算的延遲時間的「抖動」(隨機變化)量。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | 0.0 |
6.1 | 0.15 |
3.16.10 config.active_job.log_query_tags_around_perform
決定是否透過 around_perform
自動更新查詢標籤的工作內容。預設值為 true
。
3.17 設定 Action Cable
3.17.1 config.action_cable.url
接受一個字串,表示您託管 Action Cable 伺服器的 URL。如果您的 Action Cable 伺服器與主要應用程式分離,您會使用此選項。
3.17.2 config.action_cable.mount_path
接受一個字串,表示將 Action Cable 掛載到主伺服器程序中的位置。預設值為 /cable
。您可以將其設定為 nil,以不將 Action Cable 掛載為一般 Rails 伺服器的一部分。
您可以在 Action Cable 概觀中找到更詳細的設定選項。
3.17.3 config.action_cable.precompile_assets
決定是否應將 Action Cable 資產新增至資產管道的預編譯。如果未使用 Sprockets,則沒有任何效果。預設值為 true
。
3.17.4 config.action_cable.allow_same_origin_as_host
決定是否允許與纜線伺服器本身相符的來源。預設值為 true
。
設定為 false 以停用相同來源請求的自動存取,並嚴格只允許設定的來源。
3.17.5 config.action_cable.allowed_request_origins
決定纜線伺服器將接受的請求來源。在 development
環境中,預設值為 /https?:\/\/localhost:\d+/
。
3.18 設定 Active Storage
config.active_storage
提供以下設定選項
3.18.1 config.active_storage.variant_processor
接受符號 :mini_magick
或 :vips
,指定變體轉換和 blob 分析是否將使用 MiniMagick 或 ruby-vips 執行。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | :mini_magick |
7.0 | :vips |
3.18.2 config.active_storage.analyzers
接受一個類別陣列,指示 Active Storage blob 可用的分析器。預設情況下,此值定義為
config.active_storage.analyzers = [ActiveStorage::Analyzer::ImageAnalyzer::Vips, ActiveStorage::Analyzer::ImageAnalyzer::ImageMagick, ActiveStorage::Analyzer::VideoAnalyzer, ActiveStorage::Analyzer::AudioAnalyzer]
影像分析器可以擷取影像 blob 的寬度和高度;視訊分析器可以擷取視訊 blob 的寬度、高度、持續時間、角度、長寬比和視訊/音訊通道的存在/不存在;音訊分析器可以擷取音訊 blob 的持續時間和位元速率。
3.18.3 config.active_storage.previewers
接受一個類別陣列,指示 Active Storage blob 中可用的影像預覽器。預設情況下,此值定義為
config.active_storage.previewers = [ActiveStorage::Previewer::PopplerPDFPreviewer, ActiveStorage::Previewer::MuPDFPreviewer, ActiveStorage::Previewer::VideoPreviewer]
PopplerPDFPreviewer
和 MuPDFPreviewer
可以從 PDF blob 的第一頁產生縮圖;VideoPreviewer
可以從視訊 blob 的相關影格產生縮圖。
3.18.4 config.active_storage.paths
接受一個選項雜湊,指示預覽器/分析器命令的位置。預設值為 {}
,表示命令將在預設路徑中尋找。可以包含以下任何選項
:ffprobe
- ffprobe 可執行檔的位置。:mutool
- mutool 可執行檔的位置。:ffmpeg
- ffmpeg 可執行檔的位置。
config.active_storage.paths[:ffprobe] = "/usr/local/bin/ffprobe"
3.18.5 config.active_storage.variable_content_types
接受一個字串陣列,指示 Active Storage 可以透過變體處理器轉換的內容類型。預設情況下,此值定義為
config.active_storage.variable_content_types = %w(image/png image/gif image/jpeg image/tiff image/bmp image/vnd.adobe.photoshop image/vnd.microsoft.icon image/webp image/avif image/heic image/heif)
3.18.6 config.active_storage.web_image_content_types
接受一個字串陣列,將其視為 Web 影像內容類型,其中可以處理變體,而無需轉換為備用的 PNG 格式。例如,如果您想要在應用程式中使用 AVIF
變體,您可以將 image/avif
新增至此陣列。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | %w(image/png image/jpeg image/gif) |
7.2 | %w(image/png image/jpeg image/gif image/webp) |
3.18.7 config.active_storage.content_types_to_serve_as_binary
接受一個字串陣列,指示 Active Storage 將始終作為附件而非內嵌提供的內容類型。預設情況下,此值定義為
config.active_storage.content_types_to_serve_as_binary = %w(text/html image/svg+xml application/postscript application/x-shockwave-flash text/xml application/xml application/xhtml+xml application/mathml+xml text/cache-manifest)
3.18.8 config.active_storage.content_types_allowed_inline
接受一個字串陣列,指示 Active Storage 允許作為內嵌提供的內容類型。預設情況下,此值定義為
config.active_storage.content_types_allowed_inline = %w(image/webp image/avif image/png image/gif image/jpeg image/tiff image/vnd.adobe.photoshop image/vnd.microsoft.icon application/pdf)
3.18.9 config.active_storage.queues.analysis
接受一個符號,指示用於分析工作的 Active Job 佇列。當此選項為 nil
時,分析工作將傳送到預設的 Active Job 佇列(請參閱config.active_job.default_queue_name
)。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
6.0 | :active_storage_analysis |
6.1 | nil |
3.18.10 config.active_storage.queues.mirror
接受一個符號,指示用於直接上傳鏡像工作的 Active Job 佇列。當此選項為 nil
時,鏡像工作將傳送到預設的 Active Job 佇列(請參閱config.active_job.default_queue_name
)。預設值為 nil
。
3.18.11 config.active_storage.queues.preview_image
接受一個符號,指示用於預處理影像預覽的 Active Job 佇列。當此選項為 nil
時,工作將傳送到預設的 Active Job 佇列(請參閱config.active_job.default_queue_name
)。預設值為 nil
。
3.18.12 config.active_storage.queues.purge
接受一個符號,指示用於清除工作的 Active Job 佇列。當此選項為 nil
時,清除工作將傳送到預設的 Active Job 佇列(請參閱config.active_job.default_queue_name
)。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
6.0 | :active_storage_purge |
6.1 | nil |
3.18.13 config.active_storage.queues.transform
接受一個符號,指示用於預處理變體的 Active Job 佇列。當此選項為 nil
時,工作將傳送到預設的 Active Job 佇列(請參閱config.active_job.default_queue_name
)。預設值為 nil
。
3.18.14 config.active_storage.logger
可用於設定 Active Storage 使用的記錄器。接受符合 Log4r 介面或預設 Ruby Logger 類別的記錄器。
config.active_storage.logger = ActiveSupport::Logger.new(STDOUT)
3.18.15 config.active_storage.service_urls_expire_in
決定產生的 URL 的預設過期時間
ActiveStorage::Blob#url
ActiveStorage::Blob#service_url_for_direct_upload
ActiveStorage::Preview#url
ActiveStorage::Variant#url
預設為 5 分鐘。
3.18.16 config.active_storage.urls_expire_in
決定由 Active Storage 在 Rails 應用程式中產生的 URL 的預設過期時間。預設值為 nil。
3.18.17 config.active_storage.touch_attachment_records
指示 ActiveStorage::Attachments 在更新時觸發其對應的記錄。預設值為 true。
3.18.18 config.active_storage.routes_prefix
可用於設定 Active Storage 提供的路由的路由前綴。接受一個字串,該字串將附加到產生的路由中。
config.active_storage.routes_prefix = "/files"
預設值為 /rails/active_storage
。
3.18.19 config.active_storage.track_variants
決定是否在資料庫中記錄變體。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
6.1 | true |
3.18.20 config.active_storage.draw_routes
可用於切換 Active Storage 路由產生功能。預設值為 true
。
3.18.21 config.active_storage.resolve_model_to_route
可用於全域變更 Active Storage 檔案的傳遞方式。
允許的值為
:rails_storage_redirect
:重新導向至簽名、短效期的服務 URL。:rails_storage_proxy
:透過下載方式代理檔案。
預設值為 :rails_storage_redirect
。
3.18.22 config.active_storage.video_preview_arguments
可用於修改 ffmpeg 產生影片預覽影像的方式。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | "-y -vframes 1 -f image2" |
7.0 | "-vf 'select=eq(n\\,0)+eq(key\\,1)+gt(scene\\,0.015)" 1+ ",loop=loop=-1:size=2,trim=start_frame=1'" 2+ " -frames:v 1 -f image2"
|
3.18.23 config.active_storage.multiple_file_field_include_hidden
在 Rails 7.1 及更新版本中,Active Storage 的 has_many_attached
關聯性預設會取代目前的集合,而不是附加到其中。因此,為了支援提交一個空的集合,當 multiple_file_field_include_hidden
為 true
時,file_field
輔助方法將會渲染一個輔助隱藏欄位,類似於 checkbox
輔助方法所渲染的輔助欄位。
預設值取決於 config.load_defaults
目標版本
從版本開始 | 預設值為 |
---|---|
(原始) | false |
7.0 | true |
3.18.24 config.active_storage.precompile_assets
決定是否應將 Active Storage 的 assets 加入到 asset pipeline 的預編譯中。如果未使用 Sprockets,則沒有效果。預設值為 true
。
3.19 設定 Action Text
3.19.1 config.action_text.attachment_tag_name
接受一個字串,作為用於包裝附件的 HTML 標籤。預設值為 "action-text-attachment"
。
3.19.2 config.action_text.sanitizer_vendor
透過將 ActionText::ContentHelper.sanitizer
設定為供應商的 .safe_list_sanitizer
方法返回的類別實例,來設定 Action Text 使用的 HTML 清理器。預設值取決於 config.load_defaults
的目標版本
從版本開始 | 預設值為 | 它將標記解析為 |
---|---|---|
(原始) | Rails::HTML4::Sanitizer |
HTML4 |
7.1 | Rails::HTML5::Sanitizer (請參閱注意) |
HTML5 |
Rails::HTML5::Sanitizer
在 JRuby 上不受支援,因此在 JRuby 平台上,Rails 會回退到 Rails::HTML4::Sanitizer
。
3.19.3 Regexp.timeout
請參閱 Ruby 的 Regexp.timeout=
文件。
3.20 設定資料庫
幾乎每個 Rails 應用程式都會與資料庫互動。您可以透過設定環境變數 ENV['DATABASE_URL']
或使用名為 config/database.yml
的設定檔來連線到資料庫。
使用 config/database.yml
檔案,您可以指定存取資料庫所需的所有資訊
development:
adapter: postgresql
database: blog_development
pool: 5
這將使用 postgresql
介面連線到名為 blog_development
的資料庫。相同的資訊可以儲存在 URL 中,並透過類似以下的環境變數提供
ENV["DATABASE_URL"] # => "postgresql://127.0.0.1/blog_development?pool=5"
config/database.yml
檔案包含 Rails 預設可執行的三個不同環境的區段
- 當您在開發/本機電腦上手動與應用程式互動時,會使用
development
環境。 - 當執行自動化測試時,會使用
test
環境。 - 當您部署應用程式供全世界使用時,會使用
production
環境。
如果您願意,您可以在 config/database.yml
內手動指定 URL
development:
url: postgresql://127.0.0.1/blog_development?pool=5
config/database.yml
檔案可以包含 ERB 標籤 <%= %>
。標籤內的任何內容都會被當作 Ruby 程式碼執行。您可以使用它從環境變數中提取資料或執行計算以產生所需的連線資訊。
當您在 config/database.yml
檔案中使用 ENV['DATABASE_URL']
或 url
金鑰時,Rails 允許將 URL 中的協定對應到可以從應用程式內部設定的資料庫介面。這允許在不修改部署環境中設定的 URL 的情況下設定介面。請參閱:config.active_record.protocol_adapters
。
您不必手動更新資料庫設定。如果您查看應用程式產生器的選項,您會看到其中一個選項名為 --database
。此選項允許您從最常用的關聯式資料庫清單中選擇一個介面。您甚至可以重複執行產生器:cd .. && rails new blog --database=mysql
。當您確認覆寫 config/database.yml
檔案時,您的應用程式將會設定為使用 MySQL 而不是 SQLite。常見的資料庫連線的詳細範例如下。
3.21 連線偏好
由於有兩種方式可以設定您的連線(使用 config/database.yml
或使用環境變數),因此了解它們如何互動非常重要。
如果您有一個空的 config/database.yml
檔案,但存在 ENV['DATABASE_URL']
,則 Rails 將會透過您的環境變數連線到資料庫
$ cat config/database.yml
$ echo $DATABASE_URL
postgresql://127.0.0.1/my_database
如果您有 config/database.yml
但沒有 ENV['DATABASE_URL']
,則會使用此檔案連線到您的資料庫
$ cat config/database.yml
development:
adapter: postgresql
database: my_database
host: localhost
$ echo $DATABASE_URL
如果您同時設定了 config/database.yml
和 ENV['DATABASE_URL']
,則 Rails 會將設定合併在一起。為了更好地理解這一點,我們必須看一些範例。
當提供重複的連線資訊時,環境變數將優先
$ cat config/database.yml
development:
adapter: sqlite3
database: NOT_my_database
host: localhost
$ echo $DATABASE_URL
postgresql://127.0.0.1/my_database
$ bin/rails runner 'puts ActiveRecord::Base.configurations.inspect'
#<ActiveRecord::DatabaseConfigurations:0x00007fc8eab02880 @configurations=[
#<ActiveRecord::DatabaseConfigurations::UrlConfig:0x00007fc8eab020b0
@env_name="development", @spec_name="primary",
@config={"adapter"=>"postgresql", "database"=>"my_database", "host"=>"localhost"}
@url="postgresql://127.0.0.1/my_database">
]
此處的介面、主機和資料庫與 ENV['DATABASE_URL']
中的資訊相符。
如果提供非重複資訊,您將會獲得所有唯一值,在發生任何衝突時,環境變數仍然優先。
$ cat config/database.yml
development:
adapter: sqlite3
pool: 5
$ echo $DATABASE_URL
postgresql://127.0.0.1/my_database
$ bin/rails runner 'puts ActiveRecord::Base.configurations.inspect'
#<ActiveRecord::DatabaseConfigurations:0x00007fc8eab02880 @configurations=[
#<ActiveRecord::DatabaseConfigurations::UrlConfig:0x00007fc8eab020b0
@env_name="development", @spec_name="primary",
@config={"adapter"=>"postgresql", "database"=>"my_database", "host"=>"localhost", "pool"=>5}
@url="postgresql://127.0.0.1/my_database">
]
由於 ENV['DATABASE_URL']
中沒有提供 pool 連線資訊,因此其資訊會合併進來。由於 adapter
是重複的,因此 ENV['DATABASE_URL']
連線資訊勝出。
唯一明確不使用 ENV['DATABASE_URL']
中的連線資訊的方法是使用 "url"
子金鑰指定明確的 URL 連線
$ cat config/database.yml
development:
url: sqlite3:NOT_my_database
$ echo $DATABASE_URL
postgresql://127.0.0.1/my_database
$ bin/rails runner 'puts ActiveRecord::Base.configurations.inspect'
#<ActiveRecord::DatabaseConfigurations:0x00007fc8eab02880 @configurations=[
#<ActiveRecord::DatabaseConfigurations::UrlConfig:0x00007fc8eab020b0
@env_name="development", @spec_name="primary",
@config={"adapter"=>"sqlite3", "database"=>"NOT_my_database"}
@url="sqlite3:NOT_my_database">
]
此處會忽略 ENV['DATABASE_URL']
中的連線資訊,請注意不同的介面和資料庫名稱。
由於可以在 config/database.yml
中嵌入 ERB,因此最佳做法是明確顯示您正在使用 ENV['DATABASE_URL']
連線到資料庫。這在生產環境中尤其有用,因為您不應將資料庫密碼等機密資訊提交到您的原始碼控制系統(例如 Git)。
$ cat config/database.yml
production:
url: <%= ENV['DATABASE_URL'] %>
現在行為很清楚了,我們只會使用 ENV['DATABASE_URL']
中的連線資訊。
3.21.1 設定 SQLite3 資料庫
Rails 內建支援 SQLite3,這是一個輕量級的無伺服器資料庫應用程式。雖然 Rails 可以更好地設定 SQLite 以用於生產工作負載,但繁忙的生產環境可能會使 SQLite 過載。Rails 在建立新專案時預設使用 SQLite 資料庫,但您可以隨時變更。
這是預設設定檔 (config/database.yml
) 中,用於開發環境的連線資訊區段
development:
adapter: sqlite3
database: storage/development.sqlite3
pool: 5
timeout: 5000
Rails 預設使用 SQLite3 資料庫進行資料儲存,因為它是一個零設定的資料庫,開箱即用。Rails 也「開箱即用」地支援 MySQL(包括 MariaDB)和 PostgreSQL,並且有許多資料庫系統的外掛程式。如果您在生產環境中使用資料庫,Rails 很可能會有一個適合它的介面。
3.21.2 設定 MySQL 或 MariaDB 資料庫
如果您選擇使用 MySQL 或 MariaDB 而不是隨附的 SQLite3 資料庫,您的 config/database.yml
看起來會有些不同。這是開發區段
development:
adapter: mysql2
encoding: utf8mb4
database: blog_development
pool: 5
username: root
password:
socket: /tmp/mysql.sock
如果您的開發資料庫有一個具有空密碼的 root 使用者,此設定應該適用於您。否則,請在 development
區段中適當變更使用者名稱和密碼。
如果您的 MySQL 版本是 5.5 或 5.6,並且想要預設使用 utf8mb4
字元集,請設定您的 MySQL 伺服器以透過啟用 innodb_large_prefix
系統變數來支援更長的金鑰前綴。
預設情況下,MySQL 會啟用諮詢鎖,並用於使資料庫遷移能夠同時進行。您可以透過將 advisory_locks
設定為 false
來停用諮詢鎖
production:
adapter: mysql2
advisory_locks: false
3.21.3 設定 PostgreSQL 資料庫
如果您選擇使用 PostgreSQL,您的 config/database.yml
將會被自訂為使用 PostgreSQL 資料庫
development:
adapter: postgresql
encoding: unicode
database: blog_development
pool: 5
預設情況下,Active Record 會使用預備陳述式和諮詢鎖等資料庫功能。如果您正在使用 PgBouncer 等外部連線池,您可能需要停用這些功能
production:
adapter: postgresql
prepared_statements: false
advisory_locks: false
如果啟用,Active Record 預設會為每個資料庫連線建立最多 1000
個預備陳述式。若要修改此行為,您可以將 statement_limit
設定為不同的值
production:
adapter: postgresql
statement_limit: 200
使用的預備陳述式越多:您的資料庫需要的記憶體就越多。如果您的 PostgreSQL 資料庫達到記憶體限制,請嘗試降低 statement_limit
或停用預備陳述式。
3.21.4 為 JRuby 平台設定 SQLite3 資料庫
如果您選擇使用 SQLite3 並且正在使用 JRuby,您的 config/database.yml
看起來會有些不同。這是開發區段
development:
adapter: jdbcsqlite3
database: storage/development.sqlite3
3.21.5 為 JRuby 平台設定 MySQL 或 MariaDB 資料庫
如果您選擇使用 MySQL 或 MariaDB 並且正在使用 JRuby,您的 config/database.yml
看起來會有些不同。這是開發區段
development:
adapter: jdbcmysql
database: blog_development
username: root
password:
3.21.6 為 JRuby 平台設定 PostgreSQL 資料庫
如果您選擇使用 PostgreSQL 並且正在使用 JRuby,您的 config/database.yml
看起來會有些不同。這是開發區段
development:
adapter: jdbcpostgresql
encoding: unicode
database: blog_development
username: blog
password:
請在 development
區段中適當變更使用者名稱和密碼。
3.21.7 設定中繼資料儲存
預設情況下,Rails 會將您的 Rails 環境和架構的相關資訊儲存在名為 ar_internal_metadata
的內部表格中。
若要關閉每個連線的此功能,請在您的資料庫設定中設定 use_metadata_table
。這在處理無法建立表格的共用資料庫和/或資料庫使用者時非常有用。
development:
adapter: postgresql
use_metadata_table: false
3.21.8 設定重試行為
預設情況下,如果發生錯誤,Rails 會自動重新連線到資料庫伺服器並重試某些查詢。只會重試可安全重試(冪等)的查詢。重試次數可以在您的資料庫設定中透過 connection_retries
指定,或透過將值設定為 0 來停用。預設重試次數為 1。
development:
adapter: mysql2
connection_retries: 3
資料庫設定還允許設定 retry_deadline
。如果已設定 retry_deadline
,如果指定的 時間 在第一次嘗試查詢時已過,則不會重試原本可重試的查詢。例如,retry_deadline
為 5 秒表示如果自第一次嘗試查詢以來已過去 5 秒,我們將不會重試該查詢,即使它是冪等的並且還有 connection_retries
剩餘。
此值預設為 nil,表示所有可重試的查詢都會重試,無論經過多少時間。此設定的值應以秒為單位指定。
development:
adapter: mysql2
retry_deadline: 5 # Stop retrying queries after 5 seconds
3.21.9 設定查詢快取
預設情況下,Rails 會自動快取查詢回傳的結果集。如果 Rails 在同一個請求或任務中再次遇到相同的查詢,它將使用快取的結果集,而不會再次對資料庫執行查詢。
查詢快取儲存在記憶體中,為了避免使用過多記憶體,當達到閾值時,它會自動移除最近最少使用的查詢。預設的閾值是 100
,但可以在 database.yml
中設定。
development:
adapter: mysql2
query_cache: 200
要完全停用查詢快取,可以將其設定為 false
。
development:
adapter: mysql2
query_cache: false
3.22 建立 Rails 環境
預設情況下,Rails 提供了三種環境:「開發 (development)」、「測試 (test)」和「生產 (production)」。雖然這些環境足以應付大多數情況,但在某些情況下,您可能需要更多環境。
假設您有一個伺服器,它鏡像了生產環境,但僅用於測試。這樣的伺服器通常稱為「預備伺服器 (staging server)」。要為此伺服器定義一個名為「預備 (staging)」的環境,只需建立一個名為 config/environments/staging.rb
的檔案。由於這是一個類似生產環境的環境,您可以複製 config/environments/production.rb
的內容作為起點,然後從那裡進行必要的更改。也可以像這樣要求和擴充其他環境設定:
# config/environments/staging.rb
require_relative "production"
Rails.application.configure do
# Staging overrides
end
該環境與預設環境沒有什麼不同,使用 bin/rails server -e staging
啟動伺服器,使用 bin/rails console -e staging
啟動主控台,Rails.env.staging?
也可以正常運作等等。
3.23 部署到子目錄 (相對 URL 根目錄)
預設情況下,Rails 期望您的應用程式在根目錄 (例如 /
) 下執行。本節將說明如何在目錄內執行應用程式。
假設我們想將應用程式部署到 "/app1"。Rails 需要知道這個目錄才能產生適當的路由。
config.relative_url_root = "/app1"
或者,您可以設定 RAILS_RELATIVE_URL_ROOT
環境變數。
現在,Rails 在產生連結時將會預先加上 "/app1"。
3.23.1 使用 Passenger
Passenger 可以讓您輕鬆地在子目錄中執行應用程式。您可以在 Passenger 手冊中找到相關的設定資訊。
3.23.2 使用反向代理
使用反向代理部署應用程式比傳統部署具有明顯的優勢。它們可以讓您透過分層應用程式所需的組件來更好地控制伺服器。
許多現代網路伺服器可以用作代理伺服器,以平衡第三方元素,例如快取伺服器或應用程式伺服器。
您可以使用的其中一個應用程式伺服器是 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 使用初始化檔案
在載入框架和應用程式中的任何 Gem 之後,Rails 會開始載入初始化器。初始化器是應用程式中儲存在 config/initializers
下的任何 Ruby 檔案。您可以使用初始化器來保存應在載入所有框架和 Gem 後才進行的設定,例如設定這些部分的選項。
config/initializers
中的檔案 (以及 config/initializers
的任何子目錄) 會在 load_config_initializers
初始化器中排序並逐一載入。
如果初始化器中的程式碼依賴於另一個初始化器中的程式碼,您可以將它們合併到單一初始化器中。這會使相依性更加明確,並有助於呈現應用程式中的新概念。Rails 也支援初始化器檔案名稱的編號,但這可能會導致檔案名稱變動。不建議使用 require
明確載入初始化器,因為這會導致初始化器被載入兩次。
無法保證您的初始化器會在所有 Gem 初始化器之後執行,因此任何依賴於特定 Gem 已初始化的初始化程式碼都應放入 config.after_initialize
區塊中。
6 載入 Hook
Rails 程式碼通常可以在應用程式載入時被引用。Rails 負責這些框架的載入順序,因此當您過早載入框架 (例如 ActiveRecord::Base
) 時,您會違反應用程式與 Rails 之間的隱式合約。此外,透過在應用程式啟動時載入程式碼 (例如 ActiveRecord::Base
),您會載入整個框架,這可能會減慢您的啟動時間,並可能導致載入順序與應用程式啟動的衝突。
載入和設定 Hook 是允許您連入此初始化過程而不會違反 Rails 載入合約的 API。這也將減輕啟動效能下降的問題並避免衝突。
6.1 避免載入 Rails 框架
由於 Ruby 是一種動態語言,因此某些程式碼會導致載入不同的 Rails 框架。以這個程式碼片段為例:
ActiveRecord::Base.include(MyActiveRecordHelper)
這個程式碼片段表示,當載入這個檔案時,它會遇到 ActiveRecord::Base
。此遭遇會導致 Ruby 尋找該常數的定義並要求它。這會導致在啟動時載入整個 Active Record 框架。
ActiveSupport.on_load
是一種機制,可用於延遲載入程式碼,直到實際需要時才載入。上面的程式碼片段可以變更為:
ActiveSupport.on_load(:active_record) do
include MyActiveRecordHelper
end
這個新的程式碼片段只會在載入 ActiveRecord::Base
時才包含 MyActiveRecordHelper
。
6.2 何時呼叫 Hook?
在 Rails 框架中,當載入特定的程式庫時,會呼叫這些 Hook。例如,當載入 ActionController::Base
時,會呼叫 :action_controller_base
Hook。這表示所有具有 :action_controller_base
Hook 的 ActiveSupport.on_load
呼叫都將在 ActionController::Base
的上下文中呼叫 (這表示 self
將是一個 ActionController::Base
)。
6.3 修改程式碼以使用載入 Hook
修改程式碼通常很簡單。如果您的程式碼中有一行程式碼參考了 Rails 框架 (例如 ActiveRecord::Base
),您可以將該程式碼包裝在載入 Hook 中。
修改對 include
的呼叫
ActiveRecord::Base.include(MyActiveRecordHelper)
變成
ActiveSupport.on_load(:active_record) do
# self refers to ActiveRecord::Base here,
# so we can call .include
include MyActiveRecordHelper
end
修改對 prepend
的呼叫
ActionController::Base.prepend(MyActionControllerHelper)
變成
ActiveSupport.on_load(:action_controller_base) do
# self refers to ActionController::Base here,
# so we can call .prepend
prepend MyActionControllerHelper
end
修改對類別方法的呼叫
ActiveRecord::Base.include_root_in_json = true
變成
ActiveSupport.on_load(:active_record) do
# self refers to ActiveRecord::Base here
self.include_root_in_json = true
end
6.4 可用的載入 Hook
這些是您可以在自己的程式碼中使用的載入 Hook。若要連入以下其中一個類別的初始化過程,請使用可用的 Hook。
類別 | Hook |
---|---|
ActionCable |
action_cable |
ActionCable::Channel::Base |
action_cable_channel |
ActionCable::Connection::Base |
action_cable_connection |
ActionCable::Connection::TestCase |
action_cable_connection_test_case |
ActionController::API |
action_controller_api |
ActionController::API |
action_controller |
ActionController::Base |
action_controller_base |
ActionController::Base |
action_controller |
ActionController::TestCase |
action_controller_test_case |
ActionDispatch::IntegrationTest |
action_dispatch_integration_test |
ActionDispatch::Response |
action_dispatch_response |
ActionDispatch::Request |
action_dispatch_request |
ActionDispatch::SystemTestCase |
action_dispatch_system_test_case |
ActionMailbox::Base |
action_mailbox |
ActionMailbox::InboundEmail |
action_mailbox_inbound_email |
ActionMailbox::Record |
action_mailbox_record |
ActionMailbox::TestCase |
action_mailbox_test_case |
ActionMailer::Base |
action_mailer |
ActionMailer::TestCase |
action_mailer_test_case |
ActionText::Content |
action_text_content |
ActionText::Record |
action_text_record |
ActionText::RichText |
action_text_rich_text |
ActionText::EncryptedRichText |
action_text_encrypted_rich_text |
ActionView::Base |
action_view |
ActionView::TestCase |
action_view_test_case |
ActiveJob::Base |
active_job |
ActiveJob::TestCase |
active_job_test_case |
ActiveModel::Model |
active_model |
ActiveModel::Translation |
active_model_translation |
ActiveRecord::Base |
active_record |
ActiveRecord::Encryption |
active_record_encryption |
ActiveRecord::TestFixtures |
active_record_fixtures |
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter |
active_record_postgresqladapter |
ActiveRecord::ConnectionAdapters::Mysql2Adapter |
active_record_mysql2adapter |
ActiveRecord::ConnectionAdapters::TrilogyAdapter |
active_record_trilogyadapter |
ActiveRecord::ConnectionAdapters::SQLite3Adapter |
active_record_sqlite3adapter |
ActiveStorage::Attachment |
active_storage_attachment |
ActiveStorage::VariantRecord |
active_storage_variant_record |
ActiveStorage::Blob |
active_storage_blob |
ActiveStorage::Record |
active_storage_record |
ActiveSupport::TestCase |
active_support_test_case |
i18n |
i18n |
7 初始化事件
Rails 有 5 個初始化事件,可以連入 (按執行順序排列):
before_configuration
:當應用程式類別在config/application.rb
中繼承自Rails::Application
時,會在執行類別主體之前執行。引擎可以使用此 Hook 在應用程式本身被設定之前執行程式碼。before_initialize
:會在應用程式的初始化過程發生之前,在 Rails 初始化過程接近開頭的:bootstrap_hook
初始化器中直接執行。to_prepare
:在所有 Railtie (包括應用程式本身) 的初始化器執行後執行,但在急切載入和建立中介軟體堆疊之前執行。更重要的是,它會在development
中每次重新載入程式碼時執行,但在production
和test
中只會執行一次 (在啟動期間)。before_eager_load
:會在急切載入發生之前直接執行,這是production
環境的預設行為,而不是development
環境的預設行為。after_initialize
:會在應用程式初始化完成後直接執行,在執行config/initializers
中的應用程式初始化器之後執行。
若要為這些 Hook 定義事件,請在 Rails::Application
、Rails::Railtie
或 Rails::Engine
子類別中使用區塊語法:
module YourApp
class Application < Rails::Application
config.before_initialize do
# initialization code goes here
end
end
end
或者,您也可以透過 Rails.application
物件上的 config
方法來執行:
Rails.application.config.before_initialize do
# initialization code goes here
end
您的應用程式的某些部分 (尤其是路由) 在呼叫 after_initialize
區塊時尚未設定。
7.1 Rails::Railtie#initializer
Rails 在啟動時會執行幾個初始化器,這些初始化器都是使用 Rails::Railtie
的 initializer
方法定義的。以下是 Action Controller 的 set_helpers_path
初始化器的範例:
initializer "action_controller.set_helpers_path" do |app|
ActionController::Helpers.helpers_path = app.helpers_paths
end
initializer
方法接受三個引數,第一個是初始化器的名稱,第二個是選項雜湊 (此處未顯示),第三個是一個區塊。可以在選項雜湊中指定 :before
鍵,以指定此新初始化器必須在哪個初始化器之前執行,而 :after
鍵將指定在此初始化器之後執行哪個初始化器。
使用 initializer
方法定義的初始化器,會依照它們被定義的順序執行,但使用 :before
或 :after
方法的初始化器除外。
只要邏輯上合理,您可以將初始化器放在鏈中的任何其他初始化器之前或之後。假設您有四個初始化器,分別稱為「one」到「four」(按照該順序定義),而您定義「four」要放在「two」之前,但要放在「three」之後,這就不合邏輯,Rails 將無法確定您的初始化器順序。
initializer
方法的區塊參數是應用程式本身的實例,因此我們可以像範例中一樣,使用 config
方法來存取其設定。
由於 Rails::Application
(間接)繼承自 Rails::Railtie
,您可以在 config/application.rb
中使用 initializer
方法來定義應用程式的初始化器。
7.2 初始化器
以下是 Rails 中所有初始化器的完整列表,按照它們被定義(並因此執行的順序,除非另有說明)排列。
load_environment_hook
:作為一個佔位符,以便可以定義:load_environment_config
在它之前執行。load_active_support
:載入active_support/dependencies
,它建立了 Active Support 的基礎。如果config.active_support.bare
為非真值(預設為否),則選擇性地載入active_support/all
。initialize_logger
:初始化應用程式的日誌記錄器(一個ActiveSupport::BroadcastLogger
物件),並使其可透過Rails.logger
存取,前提是沒有初始化器在這一點之前定義了Rails.logger
。initialize_cache
:如果Rails.cache
尚未設定,則透過參考config.cache_store
中的值來初始化快取,並將結果儲存為Rails.cache
。如果此物件回應middleware
方法,則其 middleware 會被插入 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
:基於config.active_support.report_deprecations
、config.active_support.deprecation
、config.active_support.disallowed_deprecation
和config.active_support.disallowed_deprecation_warnings
,為Rails.application.deprecators
設定棄用報告行為。active_support.initialize_time_zone
:根據config.time_zone
設定,設定應用程式的預設時區,預設值為「UTC」。active_support.initialize_beginning_of_week
:根據config.beginning_of_week
設定,設定應用程式的預設週起始日,預設值為:monday
。active_support.set_configs
:透過使用config.active_support
中的設定,將方法名稱以 setter 的形式傳遞給ActiveSupport
並傳遞值,來設定 Active Support。action_dispatch.configure
:將ActionDispatch::Http::URL.tld_length
設定為config.action_dispatch.tld_length
的值。action_view.set_configs
:透過使用config.action_view
中的設定,將方法名稱以 setter 的形式傳遞給ActionView::Base
並傳遞值,來設定 Action View。action_controller.assets_config
:如果沒有明確設定,則將config.action_controller.assets_dir
初始化為應用程式的 public 目錄。action_controller.set_helpers_path
:將 Action Controller 的helpers_path
設定為應用程式的helpers_path
。action_controller.parameters_config
:為ActionController::Parameters
設定強參數選項。action_controller.set_configs
:透過使用config.action_controller
中的設定,將方法名稱以 setter 的形式傳遞給ActionController::Base
並傳遞值,來設定 Action Controller。action_controller.compile_config_methods
:初始化指定設定的配置方法,以便更快地存取它們。active_record.initialize_timezone
:將ActiveRecord::Base.time_zone_aware_attributes
設定為true
,並將ActiveRecord::Base.default_timezone
設定為 UTC。從資料庫讀取屬性時,它們將被轉換為Time.zone
指定的時區。active_record.logger
:如果ActiveRecord::Base.logger
尚未設定,則將其設定為Rails.logger
。active_record.migration_error
:設定中間件以檢查是否有待執行的遷移。active_record.check_schema_cache_dump
:如果已設定並可用,則載入 schema 快取傾印。active_record.set_configs
:透過使用config.active_record
中的設定,將方法名稱以 setter 的形式傳遞給ActiveRecord::Base
並傳遞值,來設定 Active Record。active_record.initialize_database
:(預設) 從config/database.yml
載入資料庫配置,並為目前的環境建立連線。active_record.log_runtime
:包含ActiveRecord::Railties::ControllerRuntime
和ActiveRecord::Railties::JobRuntime
,它們負責將請求的 Active Record 呼叫所花費的時間回報給日誌記錄器。active_record.set_reloader_hooks
:如果config.enable_reloading
設定為true
,則重設所有可重新載入的資料庫連線。active_record.add_watchable_files
:將schema.rb
和structure.sql
檔案新增到可監看的檔案中。active_job.logger
:如果ActiveJob::Base.logger
尚未設定,則將其設定為Rails.logger
。active_job.set_configs
:透過使用config.active_job
中的設定,將方法名稱以 setter 的形式傳遞給ActiveJob::Base
並傳遞值,來設定 Active Job。action_mailer.logger
:如果ActionMailer::Base.logger
尚未設定,則將其設定為Rails.logger
。action_mailer.set_configs
:透過使用config.action_mailer
中的設定,將方法名稱以 setter 的形式傳遞給ActionMailer::Base
並傳遞值,來設定 Action Mailer。action_mailer.compile_config_methods
:初始化指定設定的配置方法,以便更快地存取它們。set_load_path
:此初始化器在bootstrap_hook
之前執行。將config.paths.load_paths
指定的路徑新增到$LOAD_PATH
。除非您將config.add_autoload_paths_to_load_path
設定為false
,否則它也會新增config.autoload_paths
、config.eager_load_paths
、config.autoload_once_paths
指定的所有自動載入路徑。set_autoload_paths
:此初始化器在bootstrap_hook
之前執行。將app
的所有子目錄以及config.autoload_paths
、config.eager_load_paths
和config.autoload_once_paths
指定的路徑新增到ActiveSupport::Dependencies.autoload_paths
。add_routing_paths
:(預設) 載入所有config/routes.rb
檔案(在應用程式和 railties 中,包括引擎),並設定應用程式的路由。add_locales
:將config/locales
中的檔案(來自應用程式、railties 和引擎)新增到I18n.load_path
,使這些檔案中的翻譯可用。add_view_paths
:將應用程式、railties 和引擎中的app/views
目錄新增到應用程式視圖檔案的查找路徑。add_mailer_preview_paths
:將應用程式、railties 和引擎中的test/mailers/previews
目錄新增到應用程式郵件預覽檔案的查找路徑。load_environment_config
:此初始化器在load_environment_hook
之前執行。載入目前環境的config/environments
檔案。prepend_helpers_path
:將應用程式、railties 和引擎中的app/helpers
目錄新增到應用程式輔助函數的查找路徑。load_config_initializers
:載入應用程式、railties 和引擎中config/initializers
中的所有 Ruby 檔案。此目錄中的檔案可用於保存應在所有框架載入後進行的配置設定。engines_blank_point
:如果您希望在引擎載入之前執行任何操作,則提供一個初始化點。在此點之後,所有 railtie 和引擎初始化器都會執行。add_generator_templates
:查找應用程式、railties 和引擎中lib/templates
的產生器範本,並將這些範本新增到config.generators.templates
設定中,這將使範本可供所有產生器參考。ensure_autoload_once_paths_as_subset
:確保config.autoload_once_paths
只包含來自config.autoload_paths
的路徑。如果它包含額外的路徑,則會引發例外。add_to_prepare_blocks
:應用程式、railtie 或引擎中每個config.to_prepare
呼叫的區塊都會被新增到 Action Dispatch 的to_prepare
回呼中,這些回呼將在開發環境中為每個請求執行,或在生產環境中在第一個請求之前執行。add_builtin_route
:如果應用程式在開發環境下執行,則會將rails/info/properties
的路由附加到應用程式路由。此路由為預設 Rails 應用程式中的public/index.html
提供詳細資訊,例如 Rails 和 Ruby 版本。build_middleware_stack
:為應用程式建構 middleware 堆疊,返回一個具有call
方法的物件,該方法接受請求的 Rack 環境物件。eager_load!
:如果config.eager_load
為true
,則執行config.before_eager_load
掛鉤,然後呼叫eager_load!
,它將載入所有config.eager_load_namespaces
。finisher_hook
:為應用程式的初始化過程完成後提供一個掛鉤,並執行應用程式、railties 和引擎的所有config.after_initialize
區塊。set_routes_reloader_hook
:設定 Action Dispatch 使用ActiveSupport::Callbacks.to_run
重新載入路由檔案。disable_dependency_loading
:如果config.eager_load
設定為true
,則停用自動依賴項載入。
8 資料庫連線池
Active Record 資料庫連線由 ActiveRecord::ConnectionAdapters::ConnectionPool
管理,它確保連線池同步對有限數量的資料庫連線的執行緒存取量。此限制預設為 5,可以在 database.yml
中設定。
development:
adapter: sqlite3
database: storage/development.sqlite3
pool: 5
timeout: 5000
由於連線池預設在 Active Record 內部處理,因此所有應用程式伺服器(Thin、Puma、Unicorn 等)的行為應該相同。資料庫連線池最初是空的。隨著對連線的需求增加,它將會建立它們,直到達到連線池限制。
任何一個請求在第一次需要存取資料庫時都會檢出一個連線。在請求結束時,它會將連線檢回。這表示額外的連線槽將再次可供佇列中的下一個請求使用。
如果您嘗試使用超過可用連線的數量,Active Record 將會阻止您並等待來自連線池的連線。如果它無法取得連線,則會拋出類似於下面給出的逾時錯誤。
ActiveRecord::ConnectionTimeoutError - could not obtain a database connection within 5.000 seconds (waited 5.000 seconds)
如果您收到上述錯誤,您可能需要透過增加 database.yml
中的 pool
選項來增加連線池的大小。
如果您在多執行緒環境中執行,可能會發生多個執行緒同時存取多個連線的情況。因此,根據您目前的請求負載,很可能會有多個執行緒爭奪數量有限的連線。
9 自訂設定
您可以使用 Rails 設定物件,在 config.x
命名空間下或直接使用 config
進行自訂程式碼設定。這兩者的主要區別在於,如果您要定義巢狀設定(例如:config.x.nested.hi
),則應使用 config.x
,而對於單層設定(例如:config.hello
),則應直接使用 config
。
config.x.payment_processing.schedule = :daily
config.x.payment_processing.retries = 3
config.super_debugger = true
這些設定點隨後可透過設定物件存取。
Rails.configuration.x.payment_processing.schedule # => :daily
Rails.configuration.x.payment_processing.retries # => 3
Rails.configuration.x.payment_processing.not_set # => nil
Rails.configuration.super_debugger # => true
您也可以使用 Rails::Application.config_for
來載入整個設定檔。
# config/payment.yml
production:
environment: production
merchant_id: production_merchant_id
public_key: production_public_key
private_key: production_private_key
development:
environment: sandbox
merchant_id: development_merchant_id
public_key: development_public_key
private_key: development_private_key
# config/application.rb
module MyApp
class Application < Rails::Application
config.payment = config_for(:payment)
end
end
Rails.configuration.payment["merchant_id"] # => production_merchant_id or development_merchant_id
Rails::Application.config_for
支援 shared
設定,以將通用設定分組。共享設定將會合併到環境設定中。
# config/example.yml
shared:
foo:
bar:
baz: 1
development:
foo:
bar:
qux: 2
# development environment
Rails.application.config_for(:example)[:foo][:bar] #=> { baz: 1, qux: 2 }
10 搜尋引擎索引
有時,您可能會希望防止應用程式的某些頁面在 Google、Bing、Yahoo 或 Duck Duck Go 等搜尋網站上顯示。索引這些網站的機器人會先分析 http://your-site.com/robots.txt
檔案,以了解允許索引哪些頁面。
Rails 會在 /public
資料夾內為您建立此檔案。預設情況下,它允許搜尋引擎索引應用程式的所有頁面。如果您想封鎖應用程式所有頁面的索引,請使用此設定:
User-agent: *
Disallow: /
若要僅封鎖特定頁面,則必須使用更複雜的語法。請在官方文件中了解。