原文:http://api.rubyonrails.org/classes/Rails/Railtie.html

Railtie 是 Rails  框架的核心,提供几个钩子来扩展或修改 Rails 的启动过程。
Rails 的每个主要组件都是一个 Railtie,例如Action Mailer, Action Controller, Action View and Active Record。他们每一个都为自己的启动负责,这使得 Rails 本身不参与任何组件的钩子没,允许其他组件可以被用来提到 Rails 的默认设置。
 
开发一个 Rails 扩展插件不需要使用 Railtie,但是如果你需要在 Rails 启动前后和框架交互的时候,那么 Railtie 使需要的。
例如,当一个扩展插件做如下事情的时候,是需要 Railtie 的:
  • 创建启动器
  • 为应用程序配置 Rails 框架,比如创建一个生成器(generator)
  • 添加 config.* 到配置环境中。
  • 为 ActiveSupport::Notifications 创建 subscriber
  • 添加 rake 任务
创建你的 Railtie
为了使用 Railtie 扩展 Rails,需要在你扩展插件的命名空间中创建一个继承自  Rails::Railtie  的 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)

   

启动器 Initializers
从你的 Railtie 中添加启动步骤到 Rails 的启动过程中,你只需要创建下面这个block:
class MyRailtie < Rails::Railtie
initializer "my_railtie.configure_rails_initialization" do
# some initialization behavior
end
end

  

如果指定参数,block 同样能接收 application object,在你需要使用一些 application 的配置,例如下面的 middleware :
 
class MyRailtie < Rails::Railtie
initializer "my_railtie.configure_rails_initialization" do |app|
app.middleware.use MyRailtie::Middleware
end
end

   

最后,如果你想匹配某个特性启动过程中每个特定的步骤,你同样可以传递  :before 和 :after 作为 initializer 的 参数。
 
配置
 
在你的 Railtie 类中,你可以得到一个包含配置的 config 对象,和所有的 railties 和 应用共享。
 
class MyRailtie < Rails::Railtie
# 定制 ORM
config.app_generators.orm :my_railtie_orm
# Add a to_prepare block which is executed once in production
# and before each request in development
config.to_prepare do
MyRailtie.setup!
end
end

   

加载 rake 任务和 生成器
如果你的 railtie 有 rake 任务,你可以通过 rake_tasks 方法告诉 Rails 去加载他们。
class MyRailtie < Rails::Railtie
rake_tasks do
load "path/to/my_railtie.tasks"
end
end
Rails 默认从你的加载路径加载生成器,如果你想把生成器放到另外一个地方,你可以在你的 Railtie 中指定一个block,此block会在正常生成器查找的时候加载。
class MyRailtie < Rails::Railtie
generators do
require "path/to/my_railtie_generator"
end
end
 Rails::Engine 只不过是一个已经设置了initializers的  Railtie 。因为 Rails::Application 是一个engine,这里描述的配置同样能应使用。
 
 

[翻译] Rails::Railtie的更多相关文章

  1. [Rails] 从 Request 到 Response(1)

    本文翻译自:Rails from Request to Response 系列:个人选择了自己感兴趣的部分进行翻译,需要阅读原文的同学请戳前面的链接. 第一部分 导言(Introduction) 服务 ...

  2. 如何用rake tasks 生成migration对应的sql

    how-to-use-rake-tasks-to-generate-migration-sql Rakefile文件里有load_tasks的方法 http://api.rubyonrails.org ...

  3. ruby rails_autolink不能加载的原因

    从rails 3.1.0开始,默认在ActionView::Helper::TextHelper中的auto_link方法已经被移除,放到了第三方的gem里:rails_autolink.遂想试一下其 ...

  4. CentOS6.5 安装gitlab以及gitolite迁移gitlab

    CentOS6.5 安装gitlab以及gitolite迁移gitlab gitlab 的安装使用以及数据结构 安装 环境: CentOS6.5 基于 nignx + unicorn 搭建的应用环境, ...

  5. jwt vs session 以rails 为例 (翻译部分)

    原文地址:https://pragmaticstudio.com/tutorials/rails-session-cookies-for-api-authentication 普通方式: 令牌为基础的 ...

  6. [ 翻译]ruby rails相关的常见服务器

    原文:http://stackoverflow.com/questions/4113299/ruby-on-rails-server-options     一,Apache vs Nginx     ...

  7. dropzonejs中文翻译手册 DropzoneJS是一个提供文件拖拽上传并且提供图片预览的开源类库.

    http://wxb.github.io/dropzonejs.com.zh-CN/dropzonezh-CN/ 由于项目需要,完成一个web的图片拖拽上传,也就顺便学习和了解了一下前端的比较新的技术 ...

  8. 尝试自己翻译了FreeCodeCamp的文章,技术方面多认识了几种技术,文章标题:Transparency in Action Free Code Camp is Now Open Source

    这是FreeCodeCamp其中一篇文章,趁着学习英文的时间,翻译这篇文章,其中讲到作者创建FCC过程,本文属于原创,第一次翻译,翻译还有诸多不足之处,请大家包含. 原文地址:https://medi ...

  9. .Net元编程【Metaprogramming in NET】 序-翻译

    最近在看这本书,比较实用.抽点时间把公开的部分内容简单的翻译了一下,下文是序部分. 书的具体地址为: http://www.amazon.cn/Metaprogramming-in-NET-Hazza ...

随机推荐

  1. Java精选笔记_JSP技术

    JSP技术 JSP概述 什么是JSP 在JSP全名是Java Server Page,它是建立在Servlet规范之上的动态网页开发技术. 在JSP文件中,HTML代码与Java代码共同存在,其中,H ...

  2. NodeJS-001-Nodejs学习文档整理(转-出自http://www.cnblogs.com/xucheng)

    Nodejs学习文档整理 http://www.cnblogs.com/xucheng/p/3988835.html 1.nodejs是什么: nodejs是一个是javascript能在后台运行的平 ...

  3. Python 解压缩Zip和Rar文件到指定目录

    #__author__ = 'Joker'# -*- coding:utf-8 -*-import urllibimport osimport os.pathimport zipfilefrom zi ...

  4. shell基础篇(九)函数

    函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高.像其他编程语言一样,Shell 也支持函数.Shell 函数必须先定义后使用1. Shell 函数的定义格式如下: ...

  5. 报错程序包org.springframework.test.context不存在

    在pom.xml文件中找到 加入了依赖,但是maven update 或者Reimport后 启动还是报错 最后使出绝招: 在maven仓库的位置 找到对应的文件夹 更奇怪了 发现明明有jar包啊! ...

  6. poj_1084 剪枝-IDA*

    题目大意 给出一个由2*S*(S+1)构成的S*S大小的火柴格.火柴可以构成1x1,2x2...SxS大小的方格.其中已经拿走了几个火柴,问最少再拿走几个火柴可以使得这些火柴无法构成任何一个方格. 题 ...

  7. springjdbc的批量操作

    这里主要是看的官方文档,如何翻译: NamedParameterJdbcTemplate The NamedParameterJdbcTemplate class adds support for p ...

  8. CodeForces - 459E Pashmak and Graph[贪心优化dp]

    E. Pashmak and Graph time limit per test 1 second memory limit per test 256 megabytes input standard ...

  9. Flask中的session和cookie以及日志

    一.笔记一session: 首先对于session在flask中应该是加密签名的cookie,所以要先生成secret_key app.secret_key = os.environ.get('SEC ...

  10. Android软件开发之EditText 详解(八)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://xys289187120.blog.51cto.com/3361352/65718 ...