Rails::Railtie 是 Rails 框架的核心,它提供了几个钩子来扩展 Rails 和/或修改初始化过程。
Rails 的每个主要组件(Action Mailer、Action Controller、Active Record 等)都实现了 railtie。每个组件都负责自己的初始化。这使得 Rails 本身没有任何组件钩子,允许使用其他组件来替代任何 Rails 默认组件。
开发 Rails 扩展 *不需要* 实现 railtie,但如果你需要在启动过程中或启动后与 Rails 框架进行交互,那么就需要一个 railtie。
例如,执行以下任何操作的扩展都需要一个 railtie:
-
创建初始化器
-
为应用程序配置 Rails 框架,例如设置生成器
-
向环境中添加
config.*键 -
使用
ActiveSupport::Notifications设置订阅者 -
添加 Rake 任务
创建 Railtie¶ ↑
要使用 railtie 扩展 Rails,请创建一个 Rails::Railtie 的子类。这个类必须在 Rails 启动过程中加载,并且通常命名为 MyNamespace::Railtie。
以下示例演示了一个可与 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
如果指定,块还可以接收应用程序对象,以防你需要访问某些特定于应用程序的配置,例如中间件。
class MyGem::Railtie < Rails::Railtie initializer "my_gem.configure_rails_initialization" do |app| app.middleware.use MyGem::Middleware end end
最后,你还可以将 :before 和 :after 作为选项传递给 initializer,以防你想将其与初始化过程中的特定步骤耦合。
Configuration¶ ↑
Railties 可以访问一个包含所有 railties 和应用程序共享的配置的配置对象。
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 任务和 Generators¶ ↑
如果你的 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 Server 旁边运行另一个进程。例如,你可能想启动 Webpack 或 React 服务器。或者,你可能需要运行你的作业调度进程,如 Sidekiq。这通常是通过打开一个新 shell 并从那里运行程序来完成的。
Rails 允许你指定一个 server 块,当 Rails 服务器启动时就会调用它。这样,用户就不需要记住打开一个新 shell 并运行另一个程序,从而减少了所有人的困惑。它可以这样使用:
class MyGem::Railtie < Rails::Railtie server do WebpackServer.start end end
Application 和 Engine¶ ↑
Engine 本质上就是一个已经设置了一些初始化器的 railtie。由于 Rails::Application 是一个 engine,这里描述的相同配置可以用于两者。
请务必查看这些特定类的文档以获取更多信息。
- A
- C
- G
- I
- R
- S
常量
| ABSTRACT_RAILTIES | = | %w(Rails::Railtie Rails::Engine Rails::Application) |
Attributes
| [R] | load_index |
类公共方法
abstract_railtie?() Link
configure(&block) Link
允许你配置 railtie。这是在 Railtie::Configurable 中看到的相同方法,但现在不再要求所有 Railtie 的子类都必须包含此模块,因此我们在类方法中提供了它。
console(&blk) Link
generators(&blk) Link
inherited(subclass) Link
instance() Link
由于 Rails::Railtie 无法实例化,任何调用 instance 的方法都只打算在 Railtie 的子类上调用。
railtie_name(name = nil) Link
rake_tasks(&blk) Link
runner(&blk) Link
server(&blk) Link
subclasses() Link
Class Protected methods
increment_load_index() Link
实例公共方法
config() Link
这用于在 Railties 上创建 config 对象,该对象是 Railtie::Configuration 的一个实例,供 Railties 和 Application 用于存储相关配置。