配置 Rails 应用程序
這個指南涵蓋了 Rails 應(yīng)用程序的配置和初始化設(shè)置.通過瀏覽這個指南,你將能:
- 調(diào)整 Rails 應(yīng)用程序的運作
- 附加程序啟動時運行的代碼
endprologue.
初始化代碼的位置
Rails 提供四個標(biāo)準(zhǔn)的位置初始化代碼
- config/application.rb
- 運行環(huán)境相關(guān)的配置文件
- 各初始化程序
- 后初始化程序(初始化完成后運行的程序)
先于Rails運行代碼
有時候你需要在 Rails 加載自己之前運行代碼, 將調(diào)用代碼放在?config/application.rb?文件的?require ‘rails/all’?之上.
配置 Rails 組件
一般而言, 配置 Rails 的工作其實就是配置 Rails 的各個組件, 就像配置 Rails 本身一樣. 配置文件+config/application.rb+ 和運行環(huán)境相關(guān)的配置文件(比如?config/environments/production.br) 可以讓你設(shè)定一些你想傳遞給所有組件的設(shè)置.
例如, 缺省的?config/application.rb?文件包括這個設(shè)置:
config.filter_parameters += [:password]
這是給 Rails 本身的設(shè)置. 如果你想向單個 Rails 組件傳遞設(shè)置, 你同樣可以在?config/application.rb?文件里通過同+config+對象做一樣的操作.
config.active_record.observers = [:hotel_observer, :review_observer]
Rails 將會使用那些特定的設(shè)置來配置 Active Record.
一般的Rails配置
這些配置方法都是由?Rails::Railtie?對象調(diào)用的,比如?Rails::Engine?或者?Rails::Application.
- config.after_initialize?會接受一個代碼塊,這個代碼塊將會在 Rails 初始化應(yīng)用程序完畢_之后_再運行. 那包括框架自身, 引擎和在+config/initializers+里的所有應(yīng)用程序初始化程序的初始化.請注意這個代碼塊_將會_為rake任務(wù)運行. 在給其它初始化程序進行配置時會很有用:
config.after_initialize do
ActionView::Base.sanitized_allowed_tags.delete ‘div’
end
- config.allow_concurrency?應(yīng)該設(shè)置為 true 來處理同時運行(線程安全)的活動. False 為默認(rèn)值. 你也許不會想要直接調(diào)用它, 那是因為要做一系列其它的調(diào)整來讓線程安全模式良好的運行.也可以通過+threadsafe!+來激活.
- config.asset_host?用于設(shè)置資源主機. 當(dāng)CDNs被使用于自己的資源主機,或者當(dāng)你想用不同的域名別名來解決瀏覽器內(nèi)建線程并發(fā)限制時會很有用.這是+config.action_controller.asset_host+ 的簡短版本
- config.asset_path?讓你布置資源的路徑.可以是一個可調(diào)用的對象, 一個字符串,或者是默認(rèn)值+nil+. 例如, 通常+blog.js+ 的路徑會是?/javascript/blog.js, 假設(shè)其絕對路徑為?path. 如果?config.asset_path?可調(diào)用, Rails 在生成資源路徑的時候調(diào)用它,并向它投遞+path+參數(shù). 如果?config.asset_path?是個字符串, 它應(yīng)該是個帶有?%s?的?sprintf?格式的字符串,?path?會插入到?%s?的位置. 在任何情況下, Rails 輸出布置好的路徑. 這是?config.action_controller.asset_path簡短版本.
config.asset_path = proc { |path| “/blog/public#{path}” }
NOTE. 如果開啟了 asset pipeline,?config.asset_path?配置會被忽略. 默認(rèn)是開啟 asset pipeline.
- config.autoload_once_paths?接受一個路徑數(shù)組, Rails將會自動加載這些路徑中的常量,所以這些常量就不會在每次請求時都被清除. 如果+config.cache_classes+是 false , 這個配置將會無效, 這在開發(fā)環(huán)境下是默認(rèn)的. 另外, 所有的自動加載都是發(fā)生一次. 數(shù)組里的所有元素必須同時在?autoload_paths?里。這默認(rèn)是空數(shù)組.
- config.autoload_paths?接受一個路徑數(shù)組, Rails將會自動加載這些路徑著哦國內(nèi)的常量. 默認(rèn)是+app+目錄下的所有目錄.
- config.action_view.cache_template_loading?控制模板是否每個請求都要重新加載. 默認(rèn)是?config.cache_classes?設(shè)置的任何值.
- config.cache_store?配置Rails緩存要使用什么緩存存儲. 可選?:memory_store,?:file_store,?:mem_cache_store?其中一個, 有或者是實現(xiàn)了緩存API的一個對象.如果目錄?tmp/cache?存在則默認(rèn)是?:file_store, 否則是?:memory_store.
- config.colorize_logging?指定記錄日志信息是否使用ANSI顏色碼.默認(rèn)是 true.
- config.consider_all_requests_local?是個標(biāo)記. 如果為 true 則任何攜帶詳細(xì)調(diào)試信息的錯誤信息都會被添加到 HTTP 回應(yīng)(response) 里, 并且?Rails::Info?控制器會顯示應(yīng)用運行時上下文到?/rails/info/properties. 在開發(fā)和測試模式默認(rèn)是 true , 在生產(chǎn)模式是 false. 為了更細(xì)致的控制, 將其設(shè)置為 false 并在控制器里實現(xiàn)+local_request?+來指定哪些請求的錯誤信息需要提供調(diào)式信息.
- config.dependency_loading?是個標(biāo)志. 將其設(shè)置為 false 可以使自動加載常量失效. 它只在?config.cache_classes?為 true 的時候才有效, 這在生產(chǎn)模式是默認(rèn)的. 這個標(biāo)志會被?config.threadsafe!?設(shè)置為 false.
- config.eager_load_paths?接受一個路徑數(shù)組。 如果有開啟類緩存,那么 Rails 會在啟動時即時加載(eager load)這些路徑里的內(nèi)容. 默認(rèn)是應(yīng)用程序?app?目錄下的所有目錄.
- config.encoding?設(shè)置整個應(yīng)用程序的編碼. 默認(rèn)是 UTF-8
- config.exceptions_app?設(shè)置異常處理應(yīng)用程序. 這個應(yīng)用程序在異常發(fā)生時會被ShowException中間件調(diào)用. 默認(rèn)是ActionDispatch::PublicExceptions.new(Rails.pulic_path).
- config.file_watcher?被用于監(jiān)測文件系統(tǒng)里文件更新的類. 在?config.reload_classes_only_on_change?為 true 的時候有效. 必須符合?ActiveSupport::FileUpdateChecker?API.
- config.file_parameters?用于過濾掉不想被顯示在日志里的參數(shù), 比如密碼和信用卡號碼.
- config.force_ssl?強制所有的請求使用+ActionDispath::SSL+中間件走 HTTPS 協(xié)議.
- config.log_level?定義 Rails 日志的冗長程度. 這個選項默認(rèn)為?:debug?并對所有模式有效,除了生產(chǎn)模式. 生產(chǎn)模式默認(rèn)為+:info+
- config.log_tags?接受一組方法, 這些方法會被?request?對象使用. 這使標(biāo)記調(diào)試信息日志行更容易, 像子域名和請求標(biāo)識(id) — 在調(diào)試多用戶應(yīng)用程序產(chǎn)品時都很有用.
- config.logger?接受一個日志類, 這個類遵循?Log4r?或者 Ruby 默認(rèn)的?logger?類的接口. 默認(rèn)是?ActiveSupport::BufferedLogger?的對象, 在生產(chǎn)模式是關(guān)閉的.
- config.middleware?讓你配置應(yīng)用程序的中間件. 這在下面的?Configuring Middleware?章節(jié)有更深入的概述
- config.preload_frameworks?使應(yīng)用程序在啟動時是否預(yù)加載所有的框架. 通過?config.threadsafe!?開啟. 默認(rèn)是?nil, 所以是關(guān)閉的.
- config.preload_classes_only_on_change?當(dāng)被監(jiān)測文件發(fā)生改變時,類是否能被重新加載.該值默認(rèn)設(shè)置為 true, 所以會默認(rèn)監(jiān)測所有在自動加載路徑里的內(nèi)容. 如果?config.cache_classes?為 true, 這個選項會被忽略.
- config.secret_token?用于指定一個鍵, 這讓應(yīng)用程序會話對比已有的密鑰來進行驗證以防止干擾.應(yīng)用程序會從config/initializers/secret_token.rb?文件里獲取被初始化為一個隨機值的?config.secret_token。
- config.serve_static_assets?配置 Rails 自己處理靜態(tài)資源. 默認(rèn)為 true, 但在生產(chǎn)環(huán)境是被關(guān)閉的,因為有運行應(yīng)用程序的服務(wù)器軟件(e.g. Nginx 或 Apache)去處理靜態(tài)資源. 將其設(shè)置為與默認(rèn)值相反的 true, 則生產(chǎn)模式下會使用 WEBrick 運行(完全不建議!)或者測試你的應(yīng)用. 不然你將不能使用頁面緩存,而且對位于公共目錄下文件的請求都會被轉(zhuǎn)給 Rails 應(yīng)用.
- config.session_store?通常在?config/initializers/session_store.rb?里設(shè)置并指定使用什么類去存儲會話. 可能的值會是默認(rèn)的+:cookie_store+,?:mem_cache_store, 或?:disabled. 最后一個告訴 Rails 不處理會話. 也可以指定自定義會話存儲:
config.session_store :my_custom_store
這個自定義存儲必須被定義為?ActionDispatch::Session::MyCustomStore. 根據(jù)這些 symbols, 它們也可以是實現(xiàn)了一些 API 的對象, 如?ActiveRecord::SessionStore, 這種情況就可以不指定命名域.
- config.threadsafe!?激活?allow_concurrency,?cache_classes,?dependency_loading?和?preload_frameworks?來讓應(yīng)用程序?qū)崿F(xiàn)線程安全。
WARNING: 線程安全操作與一般開發(fā)模式下的 Rails 不兼容的。特別要注意的是當(dāng)你調(diào)用?config.threadsafe?的時候,自動依賴加載和類重新加載都會被自動取消。
- config.time_zone?設(shè)置應(yīng)用程序 Active Record 可用的默認(rèn)時區(qū)。
- config.whiny_nil?開啟或取消當(dāng)一些方法被?nil?調(diào)用且?nil?沒有這些方法的時候拋出警告。在開發(fā)和測試環(huán)境都默認(rèn)為 true.
- config.console?讓你設(shè)置當(dāng)你運行?rails console?的時候用作控制臺的類。
它最好在?console?代碼塊下運行:
console do
require “pry”
config.console = Pry
end
配置資源
Rails 3.1, 默認(rèn)使用?sprockets?gem 來管理資源。這個 gem 可以合并并壓縮資源以降低服務(wù)器負(fù)載。
- config.assets.enabled?是一個標(biāo)記,這個標(biāo)記控制是否使用 asset pipeline。 這在?config/application.rb?里被明確的初始化了.
- config.assets.compress?標(biāo)記是否壓縮已經(jīng)編譯好的資源。這在+config/production.rb+里明確的設(shè)置為 true.
- config.assets.css_compressor?定義要使用的 CSS 壓縮器。默認(rèn)被設(shè)置為?sass-rails。目前唯一可選的值是?:yui, 這會使用?yui-compressor?gem.
- config.assets.js_compressor?定義要使用的 JavaScript 壓縮器。很可能是?:closure,?:uglifier?和?:yui,分別需要使用到?closure-compiler,?uglifier?或者?yui-compressor?gem.
- config.assets.paths?包含了所有用來搜尋資源的路徑。 添加到這個配置選項里的路徑都會被用于搜索資源.
- config.assets.precompile?讓你指定其它(+application.css+ 和?application.js以外的)資源,這些資源會在?rake assets:precompile?執(zhí)行時被預(yù)編譯.
- config.assets.prefix?指定資源目錄的前綴,默認(rèn)是+/assets+.
- config.assets.digest?使資源的名字使用 MD5 指紋。在+production.rb+默認(rèn)設(shè)置為?true.
- config.assets.debug?不合并壓縮資源。在?development.rb?里默認(rèn)不設(shè)置為?false.
- config.assets.manifest?指定資源預(yù)編譯器的待編譯列表文件所在目錄完整的路徑。默認(rèn)使用?config.assets.prefix?(譯者注: 也就是開頭有一列諸如?//=require jquery?的文件所在路徑)
- config.assets.cache_store?指定 Sprockets 使用的緩存存儲. 默認(rèn)是 Rails 的文件存儲。
- config.assets.version?是一個字符串選項,用于生成 MD5 哈希值。可以被更改從而強制對所有文件進行預(yù)編譯.
- config.assets.compile?是一個布爾值,可以用于讓Sprockets 在生產(chǎn)環(huán)境即時執(zhí)行編譯。
- config.assets.logger?接受一個遵循 Log4r 或者 Ruby 默認(rèn)?Logger?類接口的日志類.默認(rèn)和?config.logger?指定的一樣。設(shè)置config.assets.logger?為 false, 就可以關(guān)閉記錄資源處理的日志。
配置生成器
Rails 3 允許你使用?config.generators?方法修改生成器.這個方法接受一個代碼塊:
config.generators do |g|
g.orm :active_record
g.test_framework :test_unit
end
可以在這個代碼塊里使用的所有方法列表如下:
- assets?允許在創(chuàng)建一個 scaffold 時候創(chuàng)建資源文件。默認(rèn)是?true
- force_plural?運行將數(shù)據(jù)模型(model)的名字都變成復(fù)數(shù)。默認(rèn)是?false
- helper?指定是否要創(chuàng)建 helpers. 默認(rèn)是?true
- integration_tool?指定使用哪個集成工具。默認(rèn)是?nil
- javascripts?開啟生成器中 javascripts 的 hook. 被使用于 Rails 運行?scaffold?生成器的時候。默認(rèn)是 +true+。
- javascript_engine?配置用于生成資源的引擎(例如, coffee).默認(rèn)為?nil.
- orm?指定使用哪個orm. 默認(rèn)是?false?并且默認(rèn)使用 Active Record.
- performance_tool?指定使用哪個性能工具.默認(rèn)為+nil+
- resource_controller?指定當(dāng)使用?rails generate resource時,生成控制器的生成器.默認(rèn)是?:controller
- scaffold_controller?和 +resource_controller+不同,當(dāng)使用?rails generate scaffold時,指定生成器生成?scaffolded?控制器。
- stylesheets?開啟生成器中的式樣的 hook 。在Rails中被用于?scaffold?生成器運行的時候, 但這個 hook 也可以用在其它生成器。默認(rèn)為?true
- stylesheets_engine?配置生成資源的式樣引擎(例如, sass)。默認(rèn)是?css
- test_framework?指定使用哪個測試框架。默認(rèn)為?false, 并且默認(rèn)使用 Test::Unit.
- template_engine?指定使用哪個模板引擎,比如 ERB 或 Haml.默認(rèn)為?:erb.
配置中間件
所有的 Rails 應(yīng)用程序都來自于一系列標(biāo)準(zhǔn)的中間件,這些中間件以下列順序被使用于開發(fā)環(huán)境:
- ActionDispatch::SSL?強制所有請求走HTTPS協(xié)議。在?config.force_ssl?被設(shè)置為?true?的時候有效。傳遞給它的選項可以在config.ssl_options?編輯.
- ActionDispatch::Static?用于處理靜態(tài)資源。在?config.serve_static_assets?設(shè)置為?true?的時候無效。
- Rack::Lock?將應(yīng)用封裝成互斥體,所以應(yīng)用程序一次只能被單個線程調(diào)用。只在?config.action_controller_concurrency?設(shè)置為 +false+的時候才有效, 這是默認(rèn)的.
- ActiveSupport::Cache::Strategy::LocalCache?作為基礎(chǔ)的內(nèi)存支持緩存器(memory backed cache). 這個緩存器不是線程安全的,并且只是作為單個線程的臨時內(nèi)存緩存器。
- Rack::Runtime?設(shè)置一個?X-Runtime?頭部,包括執(zhí)行請求所用的時間(精確到秒)。
- Rails::Rack::Logger?通知日志請求已經(jīng)開始。請求完成后,清除所有的日志。
- ActionDispatch::ShowExceptions?救回(回收)應(yīng)用程序返回的異常,如果是本地請求或者?config.consider_all_requests_local?設(shè)置為?true?的話,還會渲染出漂亮的異常信息頁。如果?config.action_dispatch.show_exceptions?設(shè)置為 +false+, 拋出的異常會被忽略。
- ActionDispatch::RequestId?產(chǎn)生一個唯一的 X-Request-Id 頭部給 response,并啟用?ActionDispatch::Request#uuid?方法.
- ActionDispatch::RemoteIp?用于防止IP欺騙攻擊。可在?config.action_dispatch.id_spoofing_check?和config.action_dispatch.trusted_proxies?進行設(shè)置.
- Rack::Sendfile?攔截所有正文(HTTP 正文)用于處理文件的響應(yīng)(responses),并將其替換成一個服務(wù)器指定的 X-Sendfile 頭部(HTTP 頭部). 可以在?config.action_dispatch.x_sendfile_header?配置.
- ActionDispatch::Callbacks?在處理請求之前運行預(yù)先準(zhǔn)備的回調(diào)。
- ActiveRecord::ConnectionAdapters::ConnectionManagement?在每次請求完成后清除連接,除非?rack.test?鍵在請求的環(huán)境設(shè)置中設(shè)置為?true
- ActiveRecord::QueryCache?緩存請求中產(chǎn)生的 SELECT 查詢。如果換成任何 INSERT 或者 UPDATE 則緩存會被清除.
- ActionDispatch::Cookies?為請求設(shè)置 cookies.
- ActionDispatch::Session::CookieStore?負(fù)責(zé)存儲cookies中的會話。修改?config.action_controller.session_store?為那些可選值,可以使用其它可選的中間件. 另外,傳遞給這個中間件的參數(shù)可以在?config.action_controller.session_options?配置.
- ActionDispatch::Flash?設(shè)置?flash?的鍵值。只有在?config.action_controller.session_store?設(shè)置為某個值才會起作用
- ActionDispatch::ParamsParser?將請求中的參數(shù)解析到?params?里.
- Rack::MethodOverride?如果?params[:_method]?有設(shè)置值,那么允許方法被重寫。這個中間件支持 PATCH, PUT 和 DELETE 的 HTTP方法類型.
- ActionDispatch::Head?將所有 HEAD 請求轉(zhuǎn)換成 GET 請求,然后再處理。
- ActionDispatch::BestStandardsSupport?啟用 “最好的標(biāo)準(zhǔn)支持” 所以IE8能正確的渲染元素.
除了這些常用的中間件,你可以通過?config.middleware.use?方法添加自己的:
config.middleware.use Magical::Unicorns
這會將?Magical::Unicorns?中間件放置到堆棧的尾部。如果你想添加一個中間件到另一個的前面,可以使用?insert_before
config.middleware.insert_before ActionDispatch::Head, Magical::Unicorns
當(dāng)然也有 +insert_after+,它將把某個中間件插入到另一個的后面:
config.middleware.insert_after ActionDispatch::Head, Magical::Unicorns
所有的中間件也可以被完全移除并替換成其它的:
config.middleware.swap ActionDispatch::BestStandardsSupport, Magical::Unicorns
它們也能完全從堆棧中被移除.
config.middleware.delete ActionDispatch::BestStandardsSupport
除了這些操作堆棧的方法,如果你的應(yīng)用程序只作為一個 API 端的話,中間件堆棧可以像這樣設(shè)置:
config.middleware.http_only!
通過這樣做,Rails將會創(chuàng)建一個更小的中間件堆棧,這個堆棧中不會添加一些通常對瀏覽器訪問有用的中間件, 比如 Cookies, 會話,閃存(Flash), BestStandardsSupport 和 MethodOverride. 你可以手動添加它們。查閱?API App docs?可以獲得更多關(guān)于如何設(shè)置你API應(yīng)用程序的信息。
配置 i18n
- config.i18n.default_locale?設(shè)置某個使用 i18n 應(yīng)用程序的默認(rèn)本地語言環(huán)境。默認(rèn)為?:en
- config.i18n.load_path?設(shè)置 Rails 用來搜索本地化文件的路徑。默認(rèn)為?config/locales/*.{yml,rb}
配置 Active Record
config.active_record?包括了下列配置選項:
- config.active_record.logger?接受一個符合 Log4r 或者 Ruby 默認(rèn)日志類 接口的日志類, 并會被傳遞給任何新建立的數(shù)據(jù)庫連接. 你可以通過調(diào)用 Active Record 模型類或者示例的?logger?來取得這個日志類. 默認(rèn)設(shè)置為?nil?以取消日志記錄.
- config.active_record.primary_key_prefix_type?讓你調(diào)整主鍵欄的名字。默認(rèn)情況下, Rails 假設(shè)主鍵欄被命名為+id+(這個配置選項不需要設(shè)置。) 。還有兩個其它選擇:
- :table_name?將 Customer 類的主鍵欄命名為 +customerid+。
- :table_name_with_underscore?將 Customer 類的主鍵欄命名為 +customer_id+。
- config.active_record.table_name_prefix?讓你設(shè)置一個全局字符串附加到表名前面. 如果你這個字符串設(shè)置為?northwest_, 那么 Customer 類將尋找?northwest_customers?表作為它的表. 默認(rèn)是一個空字符串.
- config.active_record.table_name_suffix?讓你設(shè)置一個全局字符串附加到表名后面. 如果你將它設(shè)置為?_northwest, 那么 Customer 類將會找到?customers_northwest?作為它的表. 默認(rèn)是一個空字符串.
- config.active_record.pluralize_table_names?指定 Rails 是否以使用單復(fù)數(shù)的表名. 如果設(shè)置為 true (默認(rèn)值), 那么 Customer 類將會使用?customers?表. 如果設(shè)置為 false, 那么 Customer 類將會使用?customer?表.
- config.active_record.default_timezone?當(dāng)從數(shù)據(jù)庫獲取日期和時間時,決定是否使用?Time.local?(如果設(shè)置為?:local) 還是Time.utc?(如果設(shè)置為?:utc). 雖然 Active Record 在 Rails 以外使用時默認(rèn)為?:local, 但在 Rails 中默認(rèn)為?:utc.
- config.active_record.schema_format?控制將數(shù)據(jù)庫結(jié)構(gòu)導(dǎo)出到文件的格式。選項分別是?:ruby(默認(rèn)),與數(shù)據(jù)庫無關(guān)的選項但與 migrations 相關(guān). 或者是?:sql, 一連串 (大部分情況是與數(shù)據(jù)庫相關(guān)的) SQL 語句.
- config.active_record.timestamped_migrations?控制所有遷移腳本 (migrations) 的命名中是否帶有序列或者時間戳. 如果有多個開發(fā)者開發(fā)同一個應(yīng)用程序,建議使用默認(rèn)的時間戳.
- config.active_record.lock_optimistically?控制 Active Record 是否使用樂觀鎖, 默認(rèn)是使用的。
- config.active_record.whitelist_attributes?將會創(chuàng)建一個空白的白名單,這個名單包含了在批量賦值 (mass assignment) 防護下可進行批量賦值的模型屬性,并對應(yīng)用程序里所有模型有效。
- config.active_record.auto_explain_threshold_in_seconds?配置自動執(zhí)行(sql指令)+EXPLAIN+的臨界值。所有逼近臨界值的查詢會把它們的查詢計劃進行日志記錄。在開發(fā)模式下默認(rèn)是 0.5。
- config.active_record.dependent_restrict_raises?當(dāng)某個具有?:dependent => :restrict?關(guān)聯(lián)關(guān)系的對象被刪除時,控制該行為。設(shè)置為false將會阻止拋出+DeleteRestrictionError+異常,并且會將錯誤信息添加入到模型對象里。在開發(fā)模式下默認(rèn)為flase.
- config.active_record.mass_assignment_sanitizer?將會判斷 Rails 中對批量賦值(mass assignment)清理的嚴(yán)格程度。默認(rèn)為:strict. 在這個模式下,調(diào)用?create?或者?update_attributes?并對任何不是+attr_accessible+的屬性進行批量賦值的話,將會拋出一個異常。如果設(shè)置這個選項為?:logger的話,只會將某個屬性被賦值時的異常信息打印到日志文件,并不拋出異常。
MySQL 適配器的一個附加配置選項:
- ActiveRecord::ConnectionAdapters::MysqlAdapter.emulate_booleans?控制活動日志(Active Record)是否會將MySQL數(shù)據(jù)庫中tinyint(1)?欄當(dāng)作布爾值,默認(rèn)是true.
結(jié)構(gòu)導(dǎo)出器(Schema Dumper)的一個附加配置選項:
- ActiveRecord::SchemaDumper.ignore_tables?接受一組表,任何產(chǎn)生的(數(shù)據(jù)庫)結(jié)構(gòu)(schema)文件都_不_會包含這些表。如果config.active_record.schema_format == :ruby, 那么這個設(shè)置會被忽略.
配置 Action Controller
config.action_controller?包括了這些配置設(shè)置:
- config.action_controller.asset_host?設(shè)置資源主機。當(dāng)CDNs被用于資源主機而不是應(yīng)用程序自己處理資源時很有用.
- config.action_controller.asset_path?接受一個代碼塊,這個代碼塊配置在哪里可以找到資源文件。更簡短的版本是config.asset_path.
- config.action_controller.page_cache_directory?是 web 服務(wù)器的文檔的根目錄,使用Base.page_cache_directory = “/document/root”的值.在 Rails 中,這個目錄已經(jīng)被設(shè)置為?Rails.public_path?(它的值通常設(shè)置為Rails.root + “/public”)。改變這個值對防止public里的文件名沖突很有用,但這么做需要配置你的 web 服務(wù)器從新的地方尋找緩存文件。
- config.action_controller.page_cache_extension?配置保存在?page_cache_directory?的緩存頁面使用的擴展名。默認(rèn)為?.html
- config.action_controller.perform_caching?配置應(yīng)用程序是否進行緩存。開發(fā)模式默認(rèn)關(guān)閉,在生產(chǎn)模式默認(rèn)開啟.
- config.action_controller.default_charset?規(guī)定所有渲染器的字符編碼。默認(rèn)是 “utf-8”。
- config.action_controller.logger?接受一個符合 Log4r 或者 Ruby 默認(rèn)日志類的接口的日志類,這個日志類用于記錄來自 Action Controller 的信息。設(shè)置為?nil?則不進行記錄。
- config.action_controller.request_forgery_protection_token?為 RequestForgery 設(shè)置令牌的參數(shù)名。調(diào)用?protect_from_forgery默認(rèn)將其設(shè)置為+authenticity_token+。
- config.action_controller.allow_forgery_protection_token?是否使用 CSRF 保護。默認(rèn)在測試模式下使用,其它模式不使用。
- config.action_controller.relative_url_root?用于告訴 Rails 你要部署到某個子目錄。默認(rèn)為ENV[‘RAILS_RELATIVE_URL_ROOT’]。
緩存代碼的兩個附加設(shè)置:
- ActionController::Base.page_cache_directory?設(shè)置緩存頁面的存放目錄,這些頁面是 Rails 為你的web服務(wù)器創(chuàng)建的。默認(rèn)為Rails.public_path(通常設(shè)置為?Rails.root + “/public”).
- ActionController::Base.page_cache_extensions?設(shè)置緩存頁(文件)的擴展名(如果請求已經(jīng)有擴展名,那將忽略這個設(shè)置)。默認(rèn)為?.html。
Active Record 會話存儲也可以這樣配置:
- ActiveRecord::SessionStore::Session.table_name?設(shè)置會話存儲使用的表名。默認(rèn)為 +session+。
- ActiveRecord::SessionStore::Session.primary_key?設(shè)置會話存儲表 ID 欄的名字。默認(rèn)為 +session_id+。
- ActiveRecord::SessionStore::Session.data_column_name?設(shè)置存放匯集了會話數(shù)據(jù)那欄的名字。默認(rèn)為 +data+。
配置 Action Dispatch
- config.action_dispatch.session_store?設(shè)置會話數(shù)據(jù)存儲的名字。默認(rèn)是?:cookie_store;其它可選的包括?:active_record_store,:men_cache_store?或者你自己定義的類名。
- config.action_dispatch.tld_length?設(shè)置應(yīng)用程序 TLD (頂級域)的長度.默認(rèn)為?1.
- ActionDispatch::Callbacks.before?接受一個代碼塊,在請求之前運行。
- ActionDispatch::Callbacks.to_prepare?接受一個代碼塊,在?Action::Dispatch::Callbacks.before?之后運行,但在請求之前。+development+模式中每個請求都會運行這個代碼塊,但在?production?模式下或者設(shè)置?cache_classes?為 true 的環(huán)境只運行一次.
- ActionDispatch::Callbacks.after?接受一個代碼塊,在請求之后運行。
配置 Action View
config.action_view?包括了這些配置設(shè)置:
- config.action_view.field_error_proc?提供一個 HTML 生成器,用于顯示 Active Record 的錯誤信息。默認(rèn)為
Proc.new { |html_tag, instance| %Q(
#{html_tag} ).html_safe }- config.action_view.default_form_builder?告訴Rails默認(rèn)使用哪個表格創(chuàng)建器。默認(rèn)為?ActionView::Helpers::FormBuilder.
- config.action_view.logger?接受一個日志類,這個類要遵循 Log4r 或者 Ruby 默認(rèn)日志類的接口。該類會被用于記錄來自 Action View 的信息。設(shè)置為?nil?來關(guān)閉日志。
- config.action_view.erb_trim_mode?給出被ERB使用的修剪模式。默認(rèn)為?‘-’。更多信息查閱?ERB documentation
(譯者注:?<%= content -%>?將清除 content 首尾的空白)
- config.action_view.javascript_expansions?是一個包含了擴展的哈希數(shù)組。這些擴展可以通過 JavaScript 導(dǎo)入標(biāo)簽被導(dǎo)入使用。默認(rèn)情況下是這么定義的:
config.action_view.javascript_expansions = { :defaults => %w(jquery jquery_ujs) }
然而,你也許像這樣定義其它的擴展:
config.action_view.javascript_expansions[:prototype] = [‘prototype’, ‘effects’, ‘dragdrop’, ‘controls’]
并且可以在視圖里像這樣進行引用:
<%= javascript_include_tag :prototype %>
- config.action_view.stylesheet_expansions?跟?javascript_expansions?的工作方式差不多,但沒有默認(rèn)的項。在這個哈希數(shù)組定義的所有鍵都可以在視圖里像這樣引用:
<%= stylesheet_link_tag :special %>
- config.action_view.cache_asset_ids?當(dāng)啟用緩存時,資源標(biāo)簽助手(helper)會進行幾個高耗的文件系統(tǒng)調(diào)用(默認(rèn)進行文件系統(tǒng)時間戳檢查)。然而這樣可以防止當(dāng)服務(wù)器運行時修改任何資源文件。
- cofnig.action_view.embed_authenticity_token_in_remote_forms?讓你設(shè)置具有?:remote => true?屬性的表單中是否默認(rèn)帶有 +authenticity_token+。默認(rèn)情況下這個值設(shè)置為 false , 這意味著遠程表單里將不包含 +authenticity_token+,這對你局部緩存表單會很有用。運程表單將通過?meta?標(biāo)簽獲得真實性(認(rèn)證), 所以嵌入是必要的,除非你支持沒有 Javascript 的瀏覽器。在這種情況下,你可以投遞?:authenticity_token => true?作為表單參數(shù)或者將這個配置設(shè)置為?true
- config.action_view.prefix_partial_path_with_controller_namespace?用來指定控制器是否從模板的子目錄中根據(jù)控制器的命名空間搜索 partial 模板。例如,考慮某個命名為?Admin::PostsController?的控制器,它渲染這個模板:
<%= render @post %>
默認(rèn)設(shè)置為?true, 這樣就會使用位于?/admin/posts/_post.erb?的局部視圖。將其值設(shè)置為?false?則會渲染?/posts/_post.erb,這和沒有命名域的控制器的渲染動作是一樣的。
配置 Action Mailer
config.action_mailer?有這么些可用的設(shè)置:
- config.action_mailer.logger?接受一個日志類,這個類要遵循 Log4r 或者 Ruby 默認(rèn)日志類的接口。這個類會被用于記錄來自 Action Mailer 的信息。設(shè)置為?nil?關(guān)閉日志。
- config.action_mailer.smtp_settings?允許詳細(xì)配置?:smtp?傳送方法。它接受一個選項哈希數(shù)組,可以包括一下任何選項:
- :address?– 允許你使用遠程的郵件服務(wù)器。只要改變默認(rèn)設(shè)置的 “l(fā)ocalhost” 值就可以了。
- :port?– 萬一你的郵件服務(wù)器不是運行在 25 端口的話,在這進行修改。
- :domain?– 如果你需要指定一個 HELO 域名,在這里設(shè)置。
- :user_name?– 如果你的郵件服務(wù)器需要認(rèn)證,在這個設(shè)置里填入用戶名。
- :password?– 如果你的郵件服務(wù)器需要認(rèn)證,在這里設(shè)置密碼。
- :authentication?如果你的郵件服務(wù)器需要認(rèn)證,你需要在這指定認(rèn)證的類型。這是一個 symbol 值,可填入?:plain,?:login,:cram_md5?其中一個。
- config.action_mailer.sendmail_settings?允許詳細(xì)配置?sendmail?發(fā)送方法。它接受一個包含選項的哈希數(shù)組,包括以下任何選項:
- :location?– sendmail 執(zhí)行文件的位置. 默認(rèn)為?/usr/sbin/sendmail。
- :arguments?– 命令行參數(shù)。默認(rèn)為?-i -t。
- config.action_mailer.raise_delivery_errors?設(shè)定當(dāng)郵件發(fā)送失敗時是否拋出異常。默認(rèn)為 true.
- config.action_mailer.delivery_method?指定發(fā)送方法。可用的值為?:smtp?(默認(rèn)),?:sendmail, 和?:test。
- config.action_mailer.perform_deliveries?設(shè)定郵件是否會被發(fā)送,默認(rèn)為 true. 可以將其設(shè)置為 false 以方便測試。
- config.action_mailer.default?配置 Action Mailer 的默認(rèn)值。這些默認(rèn)值為:
:mime_version => “1.0”,
:charset => “UTF-8”,
:content_type => “text/plain”,
:parts_order => [ “text/plain”, “text/enriched”, “text/html” ]
- config.action_mailer.observers?登記觀察者,在郵件被發(fā)送時會作出提醒。
config.action_mailer.observers = [“MailObserver”]
- config.action_mailer.interceptors?登記攔截器,它會在郵件發(fā)送前被調(diào)用。
config.action_mailer.interceptors = [“MailInterceptor”]
配置 Active Support
Active Support 有如下一些可用配置選項:
- config.active_support.bare?是否讓?active_support/all?在 Rails 啟動時的加載。默認(rèn)為?nil, 意思是?active_support/all?已經(jīng)加載了(所以Rails不會再加載)。
- config.active_support.escape_html_entities_in_json?設(shè)置在 JSON 序列化中是否剔除 HTML 實體。默認(rèn)為?true.
- config.active_support.use_standard_json_time_format?是否使日期序列化成 ISO 8601 格式。默認(rèn)為?false.
- ActiveSupport::BufferedLogger.silencer?設(shè)為?false?則禁止取消代碼塊里的日志記錄。默認(rèn)為 +true+。
- ActiveSupport::Cache::Store.logger?設(shè)定在緩存存儲操作中的日志類。
- ActiveSupport::Deprecation.behavior?config.active_support.deprecation?可選的設(shè)置器,它能配置 Rails 廢棄警告的動作。
- ActiveSupport::Deprecation.silence?接受一個代碼塊,這個代碼塊里的所有廢棄警告都會被忽略。
- ActiveSupport::Deprecation.slienced?設(shè)置是否打印出廢棄警告。
- ActiveSupport::Logger.silencer?設(shè)為?false?則禁止取消代碼塊里的日志記錄。默認(rèn)為 +true+。
配置數(shù)據(jù)庫
幾乎所有 Rails 應(yīng)用程序都會和數(shù)據(jù)庫交互。 數(shù)據(jù)庫在一個叫做?config/database.yml?的文件里被指定的。 如果你在一個新的 Rails 應(yīng)用里打開這個文件,你會看到一個默認(rèn)數(shù)據(jù)庫配置為 SQLite3。 該文件包含三個部分,分別是不同的 Rails 運行環(huán)境:
- development?環(huán)境用于你的開發(fā)或本地電腦,所以你可以手動控制應(yīng)用程序。
- test?環(huán)境用于運行自動測試的時候。
- production?環(huán)境用于部署應(yīng)用程序給全世界用的時候。
TIP: 你不必手動更新數(shù)據(jù)庫配置文件。如果你查看應(yīng)用程序生成器的選項, 你會發(fā)現(xiàn)其中一個選項為?—database. 這個選項允許你選擇一個適配器,這個適配器可以是最常用的關(guān)系型數(shù)據(jù)庫。你甚至可以重復(fù)運行生成器:?cd .. && rails new blog —database=mysql. 如果你確認(rèn)重寫?config/database.yml?文件, 你的應(yīng)用程序?qū)⒈慌渲檬褂?MySQL 而不是 SQLite. 常用數(shù)據(jù)庫連接的詳細(xì)例子會在下面說到。
配置 SQLite3 數(shù)據(jù)庫
Rails 內(nèi)建支持?SQLite3, SQLite3 是一個輕量型,不需要服務(wù)器的數(shù)據(jù)庫應(yīng)用程序。在一個繁忙的生產(chǎn)環(huán)境中應(yīng)該會使其過載,但在開發(fā)和測試環(huán)境會運作的很好。創(chuàng)建一個新項目的時候,Rails 會默認(rèn)使用 SQLite 數(shù)據(jù)庫,但你可以隨后自行修改.
下面這部分是默認(rèn)配置文件中開發(fā)環(huán)境的連接信息:
development:
adapter: sqlite3
database: db/development.sqlite3
pool: 5
timeout: 5000
NOTE: Rails 默認(rèn)使用 SQLite3 數(shù)據(jù)庫存儲數(shù)據(jù)是因為它是一個不需要配置就能工作的數(shù)據(jù)庫。Rails 也支持 MySQL 和 PostgreSQL, 并且有許多其它數(shù)據(jù)庫的插件。如果你在生產(chǎn)環(huán)境中使用數(shù)據(jù)庫,Rails 通常都能為其提供一個適配器.
配置 MySQL 數(shù)據(jù)庫
如果你選擇 MySQL 而不是已有的 SQLite3 數(shù)據(jù)庫,+config/database.yml+ 將會有些不同。下面是開發(fā)環(huán)境部分:
development:
adapter: mysql2
encoding: utf8
database: blog_development
pool: 5
username: root
password:
socket: /tmp/mysql.sock
如果你的開發(fā)電腦安裝的 MySQL 有一個沒有密碼的 root 用戶,你可以使用這個配置。不然,在開發(fā)環(huán)境部分的更改相應(yīng)的 username 和 password。
配置 PostgreSQL 數(shù)據(jù)庫
如果你選擇 PostgreSQL,+config/database.yml+ 要被自定義使用 PostgreSQL 數(shù)據(jù)庫:
development:
adapter: postgresql
encoding: unicode
database: blog_development
pool: 5
username: blog
password:
如果你使用外部的連接池管理的話,你可以取消 Rails 的 prepared statements:
production:
adapter: postgresql
prepared_statements: false
為 JRuby 平臺配置 SQLite3
如果你選擇使用 SQLite3 并且使用的是JRuby,?config/database.yml?將會有一點不同。這是開發(fā)環(huán)境部分:
development:
adapter: jdbcsqlite3
database: db/development.sqlite3
為 JRuby 平臺配置 MySQL
如果你選擇使用 MySQL 并且使用的是JRuby,?config/database.yml?將會有一點不同。這是開發(fā)環(huán)境部分:
development:
adapter: jdbcmysql
database: blog_development
username: root
password:
為 JRuby 平臺配置 PostgreSQL
如果你選擇使用 PostgreSQL 并且使用的是JRuby,?config/database.yml?將會有一點不同。這是開發(fā)環(huán)境部分:
development:
adapter: jdbcpostgresql
encoding: unicode
database: blog_development
username: blog
password:
修改?development?部分相應(yīng)的用戶名和密碼。
Rails 環(huán)境設(shè)置
Rails 的某些部分也可以通過設(shè)置環(huán)境變量,進行外部賦值來配置。以下環(huán)境變量會被 Rails 的各部分識別:
- +ENV[“RAILS_ENV”] 定義了 Rails 的運行環(huán)境 (生產(chǎn),開發(fā),測試等等)。
- +ENV[“RAILS_RELATIVE_URL_ROOT”] 當(dāng)你的應(yīng)用程序部署到某個子目錄下時,用它幫助路由(routing)代碼識別 URLs。
- +ENV[“RAILS_ASSET_ID”] 將重寫默認(rèn)的 cache-busting 時間戳章,這個時間戳章是 Rails 為可下載資源生成的.
- ENV[“RAILS_CACHE_ID”]?和?ENV[“RAILS_APP_VERSION”]?用于生成 Rails 緩存代碼的擴展緩存鍵。這可以讓同一個應(yīng)用程序有多個獨立分開的緩存。
使用 Initializer 文件
加載完框架和應(yīng)用程序的所有 gems 之后,Rails 會接著去加載所有的初始化程序. 初始化程序是存放在?config/initializers?里任何的一個 Ruby 文件。你可以使用 initializers 容納所有待配置選項和設(shè)置,它們會在所有框架和 gems 加載完之后進行配置和設(shè)置,例如為這些部分配置設(shè)置的選項。
NOTE: 你可以使用子文件夾來組織你的初始化程序, 因為 Rails 會縱向搜索整個 initializers 文件夾。
TIP: 如果你的 initialziers 里有一組依賴,你可以根據(jù)名字控制加載循序。例如,?01_critical.rb?將比?01_normal.rb?先被加載。
初始化事件
Rails 有 5 種初始化事件, 這些事件可以被掛上 hook (以下列出了它們的運行順序)
- before_configuration: 這個和繼承了?Rails::Application?的應(yīng)用程序常量同時運行。+config+ 回調(diào)會在這發(fā)生之前生成。
- before_initialize: 這個在應(yīng)用程序的初始化過程之前立即運行。應(yīng)用程序的初始化過程出現(xiàn)于接近 Rails 整個初始化過程的最開始,并帶有?:bootstrap_hook?初始化程序。
- to_prepare: 在所有為 Railties 運行(包括應(yīng)用程序自身)的初始化程序之后運行,但在即時加載(eager loading)和中間件堆創(chuàng)建之前運行。最重要的是,在+development+環(huán)境中,會在所有的請求上運行。而在?production?和?test?環(huán)境只會運行一次(啟動的期間)。
- before_eager_load: 在即時加載(eager loading)發(fā)生之前立即運行. 這是_生產(chǎn)_ 環(huán)境的默認(rèn)行為,但在_開發(fā)_環(huán)境則不是。
- after_initialize: 應(yīng)用程序加載后立即運行,但在應(yīng)用程序的初始化程序之前運行。
在?Rails::Application,?Rails::Railtie?或者?Rails::Engine?的子類里使用代碼塊語法, 可以為這些事件定義 hook :
module YourApp
class Application < Rails::Application
config.before_initialize do
end
end
end
可選的,你也可以通過?Rails.application?對象的?config?方法這么做。
Rails.application.config.before_initialize do
end
WARNING: 應(yīng)用程序的一些部分,特別是 觀察者(observers) 和 路由(routing) 在?after_initialize?代碼塊被調(diào)用之時都還沒有啟動。
Rails::Railtie#initializer
Rails 有數(shù)個初始化程序在(應(yīng)用程序)啟動的時候運行,它們都使用?Rails::Railtie?的?initializer?方法定義。下面是 Active Suppport 的initialize_whiny_nils?初始化程序的例子:
initializer “active_support.initialize_whiny_nils” do |app|
require ‘a(chǎn)ctive_support/whiny_nil’ if app.config.whiny_nils
end
initializer?方法接受三個參數(shù),第一個初始化程序的名字,第二個是可選項的哈希數(shù)組(這里沒有顯示)和第三個是一個代碼塊。 選項哈希數(shù)組里的?before?鍵可以指定為指定哪個初始化程序必須在這個初始化程序之前運行,而?after?鍵則指定哪個初始化程序在這個初始化程序_之后_運行。
通過?initializer?方法定義的初始化程序會按照它們被定義的順序運行,除了那個使用?:before?或者?:after?方法的。
WARNING: 如果初始化程序運行有邏輯關(guān)系,你應(yīng)該將一個初始化程序放在另一個之前或者之后。比如說有 4 個初始化程序, “one” 到 “four”(按照這個順序定義),并且你定義"four"在"four"_之前_ 但在"three"_之后_運行。像這種無邏輯的定義Rails將不能確定它們的順序。
initializer?方法的代碼塊參數(shù)是應(yīng)用程序自身的對象,所以我們能通過它使用?config?方法訪問配置,就像在例子里做的那樣。
因為?Rails::Application?繼承了?Rails::Railtie?(非直接),你可以使用?config/application.rb?里的?initializer?方法去為應(yīng)用程序定義初始化程序.
Initializers
下面是一列所有能在 Rails 中找到的初始化程序,并按它們被定義的順序排列 (也是它們運行的順序,除非有其它設(shè)定)
load_environment_hook
作為一個占位器,所以讓?:load_environment_config?可以被定義在這之前運行。
load_active_support?導(dǎo)入?active_support/dependencies?為 Active Support 建立基礎(chǔ)。如果?config.active_support.bare?不可確定, 也可以導(dǎo)入?active_support/all,這是默認(rèn)的。
preload_frameworks?如果?config.preload_frameworks?為?true?或者 "可確定性的",那么將自動地加載所有 Rails 會自動加載的依賴。一般這個配置選項是關(guān)閉的。在 Rails 里,內(nèi)部的類第一次被引用的時候才會自動加載。+:preload_frameworks+ 在初始化的時候就會一次過加載完它們。
initialize_logger?初始化應(yīng)用程序的日志類(一個?ActiveSupport::BufferedLogger?對象) 并且讓它可以通過?Rails.logger?訪問. 當(dāng)在這個點之前插入的初始化程序還沒有定義?Rails.logger?的時候運行。
initialize_cache?如果?Rails.cache?還沒有設(shè)置,則通過引用?config.cache_store?的值并將其賦予?Rails.cache?來初始化。如果該對象有?middleware?方法,它的中間件將被插入到?Rack::Runtime?之前.
set_clear_dependencies_hook?提供一個給?active_record.set_dispatch_hooks?使用的 hook, 它會在這個初始化程序之前運行. 這個初始化程序 — 只有在?cache_classes?設(shè)置為?false?的時候運行 — 使用?ActionDispatch::Callbacks.after?去除在請求中就已經(jīng)被引用并來自對象層面的常量(依賴),所以它們會在后續(xù)的請求中被重新加載。
initialize_dependency_mechanism?如果?config.cache_classes?為 true, 配置?ActiveSupport::Dependencies.mechanism?去?require依賴而不是?load?它們。
bootstrap_hook?運行所有配置了?before_initialize?的代碼塊。
i18n.callbacks?在開發(fā)環(huán)境中,建立一個?to_prepare?回調(diào), 如果任何一個本地化文件從最后一次請求之后有更改, 這個回調(diào)將會調(diào)用I18n.reload!。
active_support.initialize_whiny_nils?在?config.whiny_nils?為 true 的情況下引入?active_support/whiny_nil?這個文件會輸出如下錯誤:
Called id for nil, which would mistakenly be 4 — if you really wanted the id of nil, use object_id和:
You have a nil object when you didn’t expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each
active_support.deprecation_behaivor?為(運行)環(huán)境建立廢棄報告,默認(rèn)開發(fā)環(huán)境為?:log, 生產(chǎn)環(huán)境為?:notify?和 測試環(huán)境的:stderr。 如果?config.active_support.deprecation?沒有設(shè)置值,那么這個初始化程序就會提示用戶去?config/environments?里與當(dāng)前環(huán)境對應(yīng)的文件修改該行(config.active_support.deprecation)。那個值可以是一個數(shù)組。
active_support.initialize_time_zone?根據(jù)?config.tiem_zone?設(shè)置為應(yīng)用程序設(shè)置默認(rèn)的時區(qū),默認(rèn)為 “UTC”.
action_dispatch.configure?配置?ActionDispatch::Http::URL.tld_length?的值為?config.action_dispatch.tpl_length?的值。
action_view.cache_asset_ids?當(dāng) Active Support 加載時,設(shè)置ActionView::Helpers::AssetTagHelper::AssetPatchs.cache_asset_ids?為?false, 但前提是?config.cache_classes?也有加載。
active_view.javascript_expansions?登記由?config.active_view.javascript_expansions?和config.action_view.stylesheet_expansions?建立起來的擴展名,這個擴展名可以被 Action View 識別并且在視圖中使用.
action_controller.logger?設(shè)置?ActionController::Base.logger?— 如果這個還沒有設(shè)置 — 為?Rails.logger。
action_controller.initialize_framework_caches?設(shè)置?ActionController::Base.cache_store?— 如果它還沒有被設(shè)置 — 為Rails.cache.
action_controller.set_configs?通過使用?config.action_controller?里的設(shè)置來建立 Action Controller. 而這個初始化程序是將方法名作為 setters?send?給?ActionController::Base?并通過它傳值來使用?config.action_controller?的設(shè)置的。
action_controller.compile_config_methods?為指定的配置設(shè)置方法初始化,所以它們能被更快的訪問。
active_record.initialize_timezone?設(shè)置?ActiveRecord::Base.time_zone.aware_attributes?為 true, 就好像設(shè)置ActiveRecord::Base.default_timezone?為 UTC. 當(dāng)屬性從數(shù)據(jù)庫被讀取的時候,它們會被轉(zhuǎn)換成由?Time.zone?指定的時區(qū).
active_record.logger?設(shè)置?ActiveRecord::Base.logger?— 如果它還沒有設(shè)置 — 為?Rails.logger。
active_record.set_configs?通過使用?config.active_record?里的設(shè)置來建立 Action Record. 而這個初始化程序是將方法名作為 setters?send?給?ActionRecord::Base?并通過它傳值來使用?config.active_record?的設(shè)置的。
active_record.initialize_database?從?config/database.yml?加載數(shù)據(jù)庫配置(默認(rèn))并為當(dāng)前環(huán)境建立連接。
active_record.log_runtime?引入?ActiveRecord::Railties::ControllerRuntime,它會負(fù)責(zé)為請求代碼塊向日志器報告 Active Record 調(diào)用所使用的時間.(譯者注: 就是說?ActiveRecord::Railties::ControllerRuntime?會記錄一個請求發(fā)生時調(diào)用 Active Record 所占用的時間到日志里)
active_record.set_dispatch_hooks?如果?config.cache_classes?設(shè)置為?false?的話,重置所有可重載的數(shù)據(jù)庫連接。
action_mailer.logger?設(shè)置?ActionMailer::Base.logger?— 如果它還沒又被設(shè)置 — 為?Rails.logger.
action_mail.set_configs?通過使用?config.action_mailer?里的設(shè)置來建立 Action Mailer. 而這個初始化程序是將方法名作為 setterssend?給?ActionMailer::Base?并通過它傳值來使用?config.action_mailer?的設(shè)置的。
action_mail.compile_config_methods?為指定的配置設(shè)置方法初始化,所以它們能被更快的訪問。
set_load_path?這個初始化程序在?bootstrap_hook?之前運行。它將?vendor, +lib+,所有在?app?路徑下的目錄和任何在config.load_paths?里指定的路徑添加到?$LOAD_PATH里
set_autoload_paths?這個初始化程序在?bootstrap_hook?之前運行。 將?app?下所有的目錄和任何在?config.autoload_paths?指定的目錄添加到?ActiveSupport::Denpendencies.autoload_paths里。
add_routing_paths?加載 (默認(rèn)) 所有?config/routes.rb?(在應(yīng)用程序和 railties, 包括 engines 里的) 并為應(yīng)用程序建立路由。
add_locales?添加?config/locales?里的所有文件(來自應(yīng)用程序,railties 和 engines) 到?I18n.load_path?里,準(zhǔn)備好這些文件中的翻譯。
add_view_paths?添加應(yīng)用程序,railties 和 engines 里的?app/views, 所以應(yīng)用程序可以在這些路徑里尋找視圖文件。
load_environment_config?為當(dāng)前環(huán)境加載加載?config/environments?文件。
append_asset_paths?尋找應(yīng)用程序和所有附加的 railties 的資源路徑,還有保存?config.static_asset_paths?中可用的目錄列表。
prepend_helpers_path?添加用程序的 helpers 的查詢路徑 添加來自應(yīng)用程序,railties 和 engines 的路徑,應(yīng)用程序在這些路徑中尋找 helpers。
load_config_initializers?加載應(yīng)用程序,railties 和 engines?config/initializers?目錄下的所有 Ruby 文件。這些文件用于容納在框架加載完畢后被使用的配置設(shè)置。
engines_blanik_point?提供初始化過程中的某個點來放置 hook, 然后你就可以讓任何東西在 engines 之前被加載。在這個點之后,才輪到所有的 railtie 和 engine 運行。
add_generator_templates?搜尋位于?lib/templates?為生成器所用的模板,這用于應(yīng)用程序,所有的 railtie 和 engine 還有那些添加到?config.gengrators.templates?設(shè)置里的模板。這讓所有這些模板都可被所有的生成器引用。
ensure_autoload_once_paths_as_subset?確保?config.autoload_once_paths?只包含來自?config.autoload_paths?的路徑。如果它包含其它路徑,那么將會拋出一個異常。
add_to_prepare_blocks?在應(yīng)用程序,一個railtie 或者 engine 里的所有?config.to_prepare?調(diào)用的代碼塊會被添加到?to_prepare?所有 Action Dispatch 回調(diào)中去。這些回調(diào)在開發(fā)環(huán)境中的每個請求發(fā)生時都會運行,或者在生產(chǎn)環(huán)境中在只有在第一次請求發(fā)生時運行。
add_builtin_route?如果應(yīng)用程序運行在開發(fā)環(huán)境下,那么它會將?rails/info/properties?的路由添加到應(yīng)用程序的路由中去. 一般的Rails應(yīng)用里,這個路由提供了諸如 Rails 和 Ruby 的版本之類的信息顯示于?public/index.html.
build_middleware_stack?建造應(yīng)用程序的中間件堆棧, 返回一個又?call?方法的對象,這個方法帶有請求的一個 Rack 環(huán)境對象.
eager_load!?如果?config.cache_classes?為 true, 運行?config.before_eager_load?hook 然后調(diào)用?eager_load!, 它將會加載config.eager_load_paths?里的所有 Ruby 文件.
finisher_hook?為應(yīng)用程序初始化過程完成后提供一個 hook, 和為應(yīng)用程序, 所有的 railtie 和 engine 運行所有的config.after_initialize?代碼塊一樣.
set_routes_reloader?配置 Action Dispatch 通過使用?ActionDispatch::Callbacks.to_prepare?重新加載所有的路由文件.
disable_dependency_loading?如果?config.cache_classes?設(shè)置為 true 并且?config.dependency_loading?設(shè)置為 false, 那么取消自動加載依賴.
數(shù)據(jù)庫連接池
Active Record 數(shù)據(jù)庫連接是由?ActiveRecord::ConnectionAdapters::ConnectionPool?來管理的, 它會確保多個線程能同時訪問有限的數(shù)據(jù)庫連接. 這個限制默認(rèn)是 5 個,可以在?database.yml?里配置.
development:
adapter: sqlite3
database: db/development.sqlite3
pool: 5
timeout: 5000
因為連接池是默認(rèn)由 ActiveRecord 內(nèi)部處理的, 所有的應(yīng)用程序服務(wù)器(Thin, mongrel, Unicorn 等等) 應(yīng)該表現(xiàn)得一樣. 最初, 數(shù)據(jù)庫連接池是空的而且將會創(chuàng)建附加的連接作為它們增長的需求,知道它達到連接池的限制.
所有的請求在第一次需要訪問數(shù)據(jù)庫的時候都會簽出一個連接, 隨后將會將連接簽入回去. 在請求結(jié)束的時候,也就意味著該附加連連接槽應(yīng)該可以給隊列中的下一個請求使用.
注意. 如果你啟用了?Rails.threadsafe!?模式, 那么就有機會又?jǐn)?shù)個線程同時訪問多個連接. 所有根據(jù)你當(dāng)前的請求量, 有多個線程競爭數(shù)量有限的連接也是沒問題的.
總結(jié)
以上是生活随笔為你收集整理的配置 Rails 应用程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 古典音乐基础知识
- 下一篇: matlab画三维点坐标,已知各个点的三