class Rails::Railtie
Be sure to look at the documentation of those specific classes for more information.
can be used in both.
And since Rails::Application is an engine, the same configuration described here
A Rails::Engine is nothing more than a Railtie with some initializers already set.
== Application and Engine
end
end
require “path/to/my_railtie_generator”
generators do
class MyRailtie < Rails::Railtie
will load them during normal generators lookup:
your generators at a different location, you can specify in your Railtie a block which
By default, Rails load generators from your load path. However, if you want to place
end
end
load “path/to/my_railtie.tasks”
rake_tasks do
class MyRailtie < Rails::Railtie
rake_tasks:
If your railtie has rake tasks, you can tell Rails to load them through the method
== Loading rake tasks and generators
end
end
MyRailtie.setup!
config.to_prepare do
# and before each request in development
# Add a to_prepare block which is executed once in production
config.app_generators.orm :my_railtie_orm
# Customize the ORM
class MyRailtie < Rails::Railtie
shared by all railties and the application:
Inside the Railtie class, you can access a config object which contains configuration
== Configuration
you want to couple it with a specific step in the initialization process.
Finally, you can also pass :before and :after as option to initializer, in case
end
end
app.middleware.use MyRailtie::Middleware
initializer “my_railtie.configure_rails_initialization” do |app|
class MyRailtie < Rails::Railtie
need to access some application specific configuration, like middleware:
If specified, the block can also receive the application object, in case you
end
end
# some initialization behavior
initializer “my_railtie.configure_rails_initialization” do
class MyRailtie < Rails::Railtie
to create an initializer block:
To add an initialization step from your Railtie to Rails boot process, you just need
== Initializers
require ‘my_gem/railtie’ if defined?(Rails)
# lib/my_gem.rb
end
end
class Railtie < Rails::Railtie
module MyGem
# lib/my_gem/railtie.rb
The following example demonstrates an extension which can be used with or without Rails.
loaded during the Rails boot process.
from Rails::Railtie within your extension’s namespace. This class must be
To extend Rails using Railtie, create a Railtie class which inherits
== Creating your Railtie
* adding rake tasks
* setting up a subscriber with ActiveSupport::Notifications
* +adding config.*+ keys to the environment
* configuring a Rails framework for the application, like setting a generator
* creating initializers
For example, an extension doing any of the following would require Railtie:
or after boot, then Railtie is needed.
Railtie, but if you need to interact with the Rails framework during
Developing a Rails extension does not require any implementation of
place of any of the Rails defaults.
absent of any component hooks, allowing other components to be used in
them is responsible for their own initialization. This makes Rails itself
Action View and Active Record) is a Railtie. Each of
Every major component of Rails (Action Mailer, Action Controller,
Rails and/or modify the initialization process.
Railtie is the core of the Rails framework and provides several hooks to extend
def abstract_railtie?
def abstract_railtie? ABSTRACT_RAILTIES.include?(name) end
def config
def config @config ||= Railtie::Configuration.new end
def console(&blk)
def console(&blk) @load_console ||= [] @load_console << blk if blk @load_console end
def generate_railtie_name(class_or_module)
def generate_railtie_name(class_or_module) ActiveSupport::Inflector.underscore(class_or_module).tr("/", "_") end
def generators(&blk)
def generators(&blk) @generators ||= [] @generators << blk if blk @generators end
def inherited(base)
def inherited(base) unless base.abstract_railtie? base.send(:include, Railtie::Configurable) subclasses << base end end
def railtie_name(name = nil)
def railtie_name(name = nil) @railtie_name = name.to_s if name @railtie_name ||= generate_railtie_name(self.name) end
def railtie_namespace
def railtie_namespace @railtie_namespace ||= self.class.parents.detect { |n| n.respond_to?(:railtie_namespace) } end
def rake_tasks(&blk)
def rake_tasks(&blk) @rake_tasks ||= [] @rake_tasks << blk if blk @rake_tasks end
def run_console_blocks(app) #:nodoc:
def run_console_blocks(app) #:nodoc: self.class.console.each { |block| block.call(app) } end
def run_generators_blocks(app) #:nodoc:
def run_generators_blocks(app) #:nodoc: self.class.generators.each { |block| block.call(app) } end
def run_runner_blocks(app) #:nodoc:
def run_runner_blocks(app) #:nodoc: self.class.runner.each { |block| block.call(app) } end
def run_tasks_blocks(app) #:nodoc:
def run_tasks_blocks(app) #:nodoc: extend Rake::DSL self.class.rake_tasks.each { |block| instance_exec(app, &block) } # Load also tasks from all superclasses klass = self.class.superclass while klass.respond_to?(:rake_tasks) klass.rake_tasks.each { |t| instance_exec(app, &t) } klass = klass.superclass end end
def runner(&blk)
def runner(&blk) @load_runner ||= [] @load_runner << blk if blk @load_runner end
def subclasses
def subclasses @subclasses ||= [] end