Railties介绍

原文

Railties是Ruby on Rails的内部引擎,在Rails项目加载的过程中,会对服务器进行配置和初始化等一系列复杂的设置。

在真正启动服务器之前,需要进行一系列的配置。Railties是读取配置文件、创建项目并且连接Rails框架不同组件的引擎

Railtie类

Rails的主要组件都是Rails::Railtie的子类。举例来说,Active Record(对数据库进行查询)和Action Controller都是Railtie。

Rails::Railtie做了什么?

为了说明Railtie的功能,我们来看下相关源码。
查找源码很容易,你可以在github上克隆Ruby on Rails的源码。通过ack-grep命令(一个查找文件的命令行工具)来查找该类:

ack-grep "class Railtie"

查询结果为:railties/lib/rails/railtie.rb,通过查看该文件,我们可以获知以下信息:

  1. Railtie是抽象的,因此不能对其实例化。

    这点体现的很明确,当试图对ABSTRACT_RAILTIES常量中对应的类进行实例化时,其initialize方法会抛出一个错误。

    ABSTRACT_RAILTIES = %w(Rails::Railtie Rails::Engine Rails::Application)
    
    def abstract_railtie?
        ABSTRACT_RAILTIES.include?(name)
    end
    
    def initialize #:nodoc:
        if self.class.abstract_railtie?
            raise "#{self.class.name} is abstract, you cannot instantiate it directly."
        end
    end
    
  2. 因为Railtie是抽象的,因此其可以看作是一个需要被子类化的API。抽象类中定义的方法通常被子类所重写。这点在源码中体现的很明确,例如MyRailtie继承了Rails::Railtie,并且可以对其config对象进行配置。

      # == Configuration
    # Inside the Railtie class, you can access a config object which contains configuration
    # shared by all railties and the application:
    
    class MyRailtie < Rails::Railtie
      config.app_generators.orm :my_railtie_orm
      config.to_prepare do
       MyRailtie.setup!
      end
    end
    
  3. Railtie有四个主要方法:rake_tasks,console,runner,generators。每种方法都传入一个预先定义的块作为参数。我们可以看到Railtie的真实功能是:提供了一个配置Rails::Railtie子类的方法。

  4. Railtie是一个基类。注意其new方法是私有的。这意味着除非子类将new方法公有化,否则Railtie不能被实例化。这是Rails团队的开发者最有意思的设计之一。特别的是,Railtie的每个子类都无实例运行。

基于类的设计

最后一条提到了Railtie基于类的设计。为了更好的理解这一点,我们来看一个创建Railtie的例子。既然new方法是私有的,你不能像下面这样做:

Rails::Railtie.new

这个将在运行时报出new是私有方法的错误。正确定义Railtie的方法是这样的:

class MyNewRailtie < Rails::Railtie
    initializer "new_initialization_behavior" do
        puts "Hello!"
    end
end

这里发生了一些微妙的事情。new_initialization_behavior这个initializer定义在MyNewRailtie类中而不是任何MyNewRailtie的实例中,通常这意味着MyNewRailtie
的所有实例都可以访问这个initializer,但是因为MyNewRailtie不能被实例化,所以我们无需关心这个问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值