[翻译] Rails::Railtie

原文: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,这里描述的配置同样能应使用。

时间: 2024-08-30 17:00:57

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

Rails::Application中的一个方法调用

Ruby语言的动态性使得想仅仅通过查找相关API文档来学习Rails是完全不够的,因为API文档只记录了静态代码定义的方法,而Rails中有很多的方法都是在加载时或运行时动态生成的,想要了解这些方法必须要阅读源代码.本文以Rails工程下的config/application.rb文件中的一个方法调用为例,分析方法调用的具体过程. 1. 问题描述 假设Rails工程叫做Sample,那么在config/application.rb中会定义Sample::Application,并可以在其中调用c

记录遇到的各种rails报错

Gem配置问题 2016/01/04 把代码push到服务器上执行,rake, rails c 都给我报错 /home/bcz/.rvm/gems/ruby-1.9.3-p551/gems/ailties-3.2.11/lib/rails/railtie/configuration.rb:85:in `method_missing': undefined method `action_mailer' for #<Rails::Application::Configuration:0x000000

`block in replace_gem&#39;: Please install the mysql2 adapter: `gem install activerecord-mysql2-adapter`

在执行rails s时出现“`block in replace_gem': Please install the mysql2 adapter: `gem install activerecord-mysql2-adapter`”错误: [email protected]:/var/www/ashelf$ rails s => Booting WEBrick => Rails 3.2.22.1 application starting in development on http://0.0.

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

CentOS6.5 安装gitlab以及gitolite迁移gitlab gitlab 的安装使用以及数据结构 安装 环境: CentOS6.5 基于 nignx + unicorn 搭建的应用环境, 如果想要换成passenger,可以参考网上的文档 ruby环境是基于rbenv搭建的 1: install vim yum install -y vim 2: install git > 1.7.10 install git $ rpm -i 'http://pkgs.repoforge.org

Ruby On Rails中REST API使用示例——基于云平台+云服务打造自己的在线翻译工具

做为一个程序员可能在学习技术,了解行业新动态,解决问题时经常需要阅读英文的内容:而像我这样的英文小白就只能借助翻译工具才能理解个大概:不禁经常感慨,英文对学习计算机相关知识太重要了!最近发现IBM的云平台Blumemix,并且提供语言翻译的服务,感觉不错,就拿来研究学习一下:这里就分享一下我的研究学习过程,如何使用Ruby On Rails调用REST API打造自己的在线翻译工具,并演示如何把它发布到云平台上,让每个人都可以通过网络访问使用它. 应用效果展示 您可以通过点击效果图片的链接访问它

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

原文:http://stackoverflow.com/questions/4113299/ruby-on-rails-server-options Apache vs Nginx 他们都是web服务器,都能伺服静态文件.Apache更加流行,拥有更多的功能:Nginx则相对功能少.小巧.快速. Apache 和 Nginx都能在盒子外(out-of-the-box)伺服Ruby服务器,为此你需要使用另外的插件来组合他们. Apache 和 Nginx都能作为反向代理,就是说他们能够把进来的HT

【原创翻译】认识MVC设计模式:web应用开放的基础(基础篇)

原文地址:http://www.larryullman.com/2009/10/08/understanding-mvc/ 翻译:shadowmydx 转帖请注明 最近,我计划写一个系列关于自己在过去几个月使用的Yii框架(shadowmydx:基于PHP5的一个web开发 框架,详情自行google)的文章.但在一切开始以前,我认为首先还是需要先介绍一下MVC设计模式: 模型-视图-控制器.MVC模式(30年前就有鸟)已经成为了框架以及许多各式各样的应用的首选.MVC模 式主要着眼于分离应用的

ruby on rails模拟HTTP请求发生错误:end of file reached

在文章 Ruby On Rails中REST API使用示例--基于云平台+云服务打造自己的在线翻译工具 中,利用ruby的Net::HTTP发起http请求访问IBM Bluemix上的语言翻译服务时,提示:end of file reached 代码如下: auth = "c9819718-4660-441c-9df7-07398950ea44:qUvrJPqwsgOx"; surl = "https://" + auth + "@gateway.wa

ruby on rails新项目不使用数据库,配置过程记录

查询了大神的经验贴 http://stackoverflow.com/questions/19078044/disable-activerecord-for-rails-4 http://stackoverflow.com/questions/821251/how-to-configure-ruby-on-rails-with-no-database 其中点赞最多的也是我用的方法 If you are creating a new application, you can use -O to s