Rails::Railtie
是 Rails 框架的核心,並提供多個鉤子 (hook) 來擴展 Rails 和/或修改初始化過程。
Rails 的每個主要組件(Action Mailer、Action Controller、Active Record 等)都實作了一個 railtie。它們各自負責自己的初始化。這使得 Rails 本身没有任何組件鉤子,允許其他組件取代任何 Rails 預設值。
開發 Rails 擴展程式不需要實作 railtie,但如果您需要在啟動期間或啟動後與 Rails 框架互動,則需要 railtie。
例如,執行以下任何操作的擴展程式都需要 railtie
-
建立初始化器 (initializer)
-
為應用程式配置 Rails 框架,例如設定產生器 (generator)
-
將
config.*
鍵添加到環境中 -
使用
ActiveSupport::Notifications
設定訂閱者 -
新增 Rake 工作
建立 Railtie
要使用 railtie 擴展 Rails,請建立 Rails::Railtie
的子類別。此類別必須在 Rails 啟動過程中載入,並且通常稱為 MyNamespace::Railtie
。
以下範例示範了一個可以在 Rails 中或在 Rails 之外使用的擴展程式。
# lib/my_gem/railtie.rb
module MyGem
class Railtie < Rails::Railtie
end
end
# lib/my_gem.rb
require "my_gem/railtie" if defined?(Rails::Railtie)
初始化器
要從您的 railtie 向 Rails 啟動過程新增初始化步驟,只需使用 initializer
巨集定義初始化程式碼
class MyGem::Railtie < Rails::Railtie
initializer "my_gem.configure_rails_initialization" do
# some initialization behavior
end
end
如果指定,該區塊還可以接收應用程式物件,以防您需要存取某些應用程式特定配置,例如中介軟體 (middleware)
class MyGem::Railtie < Rails::Railtie
initializer "my_gem.configure_rails_initialization" do |app|
app.middleware.use MyGem::Middleware
end
end
最後,您也可以將 :before
和 :after
作為選項傳遞給 initializer
,以防您想要將其與初始化過程中的特定步驟耦合。
配置
Railties 可以存取一個包含所有 railties 和應用程式共用配置的 config 物件
class MyGem::Railtie < Rails::Railtie
# Customize the ORM
config.app_generators.orm :my_gem_orm
# Add a to_prepare block which is executed once in production
# and before each request in development.
config.to_prepare do
MyGem.setup!
end
end
載入 Rake 工作和 產生器
如果您的 railtie 有 Rake 工作,您可以透過 rake_tasks
方法告訴 Rails 載入它們
class MyGem::Railtie < Rails::Railtie
rake_tasks do
load "path/to/my_gem.tasks"
end
end
預設情況下,Rails 會從您的載入路徑載入產生器。但是,如果您想將產生器放在不同的位置,您可以在 railtie 中指定一個區塊,該區塊將在一般產生器查詢期間載入它們
class MyGem::Railtie < Rails::Railtie
generators do
require "path/to/my_gem_generator"
end
end
由於載入路徑上的檔名在 gem 之間共用,因此請確保您透過 railtie 載入的檔案具有唯一的名稱。
在 Rails 伺服器啟動時執行另一個程式
在開發中,通常需要在 Rails 伺服器
旁邊執行另一個程序。例如,您可能想要啟動 Webpack 或 React 伺服器。或者,您可能需要執行您的工作排程器程序,例如 Sidekiq。這通常透過開啟新的 shell 並從這裡執行程式來完成。
Rails 允許您指定一個 server
區塊,該區塊將在 Rails 伺服器啟動時被呼叫。這樣,您的使用者就不需要記住要開啟新的 shell 並執行另一個程式,從而減少所有人的混淆。它可以像這樣使用
class MyGem::Railtie < Rails::Railtie
server do
WebpackServer.start
end
end
應用程式
和 引擎
引擎只是一個已經設定了一些初始化器的 railtie。由於 Rails::Application
是一個引擎,因此這裡描述的相同配置可以在兩者中使用。
請務必查看這些特定類別的文件以獲取更多資訊。
- A
- C
- G
- I
- R
- S
常數
ABSTRACT_RAILTIES | = | %w(Rails::Railtie Rails::Engine Rails::Application) |
屬性
[R] | load_index |
類別公開方法
abstract_railtie?() 連結
來源:顯示 | 在 GitHub 上
# File railties/lib/rails/railtie.rb, line 172 def abstract_railtie? ABSTRACT_RAILTIES.include?(name) end
configure(&block) 連結
允許您配置 railtie。這與在 Railtie::Configurable
中看到的方法相同,但此模組不再是所有 Railtie
子類別所必需的,因此我們在此處提供類別方法。
來源:顯示 | 在 GitHub 上
# File railties/lib/rails/railtie.rb, line 190 def configure(&block) instance.configure(&block) end
console(&blk) 連結
來源:顯示 | 在 GitHub 上
# File railties/lib/rails/railtie.rb, line 156 def console(&blk) register_block_for(:load_console, &blk) end
generators(&blk) 連結
來源:顯示 | 在 GitHub 上
# File railties/lib/rails/railtie.rb, line 164 def generators(&blk) register_block_for(:generators, &blk) end
inherited(subclass) 連結
來源:顯示 | 在 GitHub 上
# File railties/lib/rails/railtie.rb, line 198 def inherited(subclass) subclass.increment_load_index super end
instance() 連結
由於 Rails::Railtie
無法被實例化,因此任何呼叫 instance
的方法都只能在 Railtie
的子類別上呼叫。
來源:顯示 | 在 GitHub 上
# File railties/lib/rails/railtie.rb, line 183 def instance @instance ||= new end
railtie_name(name = nil) 連結
來源:顯示 | 在 GitHub 上
# File railties/lib/rails/railtie.rb, line 176 def railtie_name(name = nil) @railtie_name = name.to_s if name @railtie_name ||= generate_railtie_name(self.name) end
rake_tasks(&blk) 連結
來源:顯示 | 在 GitHub 上
# File railties/lib/rails/railtie.rb, line 152 def rake_tasks(&blk) register_block_for(:rake_tasks, &blk) end
runner(&blk) 連結
來源:顯示 | 在 GitHub 上
# File railties/lib/rails/railtie.rb, line 160 def runner(&blk) register_block_for(:runner, &blk) end
server(&blk) 連結
來源:顯示 | 在 GitHub 上
# File railties/lib/rails/railtie.rb, line 168 def server(&blk) register_block_for(:server, &blk) end
subclasses() 連結
來源:顯示 | 在 GitHub 上
# File railties/lib/rails/railtie.rb, line 148 def subclasses super.reject(&:abstract_railtie?).sort end
類別保護方法
increment_load_index() 連結
來源:顯示 | 在 GitHub 上
# File railties/lib/rails/railtie.rb, line 206 def increment_load_index @@load_counter ||= 0 @load_index = (@@load_counter += 1) end
實例公開方法
config() 連結
這用於在 Railties 上建立 config
物件,一個 Railtie::Configuration
的實例,Railties 和 應用程式
使用它來儲存相關配置。
來源:顯示 | 在 GitHub 上
# File railties/lib/rails/railtie.rb, line 262 def config @config ||= Railtie::Configuration.new end