`
meladet
  • 浏览: 27252 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Rails源码学习(二) 上

阅读更多
    Rails整个工程涉及的模块很多,当然文件更多,在学习源码的时候经常要查找文件和方法,有一个好的IDE可以令这个过程变得轻松一些。可以使用Ecplise中的Ruby插件,把Rails的源码导入到工程中,这样查看这些文件以及查找一些方法会很方便。
    继续上次的内容,当我们用命令创建出一个App的框架之后,还会使用script/generate model(controller,scaffold)等命令生成Model、Controller模板文件。先看下面这张图:

    这张图概括了生成模板文件的主要过程以及涉及到的主要源文件,我以script/generate controller 为例,联合源码做一些说明。
    script/generate controller首先会执行你的App中script文件夹下的generate命令,我们看一下这个文件的内容:
#!/usr/bin/env ruby
require File.dirname(__FILE__) + '/../config/boot'
require 'commands/generate'

    这个文件很简单,就是启动Rails,然后调用commands文件夹下的genrate.rb文件,boot这个过程暂时不讲,在之后的文章中在具体说明,boot做的事情启动Rails,检查需要加载的Rails版本等。
    我们直接看commands文件夹下的generate.rb文件:
require "#{RAILS_ROOT}/config/environment"
require 'rails_generator'
require 'rails_generator/scripts/generate'

ARGV.shift if ['--help', '-h'].include?(ARGV[0])
Rails::Generator::Scripts::Generate.new.run(ARGV)

    这个文件代码也很少,其中envrironment.rb文件配置了你启动的Rails的环境,里面有数据库的配置、框架的配置、时区配置、i18n等。
    rails_generator.rb文件,主要是准备好生成器,包括调用生成器的名字,需要生成的模板文件等。最后Rails::Generator::Scripts::Generate.new.run(ARGV)运行生成器生成模板文件。看文件rails_generator/scripts/generate.rb,generate中有一个:command=>:create,这个参数在Commands模块中会使用到,用来生成一个Create类型的Generator Command来执行模板文件的拷贝等工作。下面是源码:
require File.dirname(__FILE__) + '/../scripts'

module Rails::Generator::Scripts
  class Generate < Base
    mandatory_options :command => :create
  end
end

    下面要看看rails_generator.rb文件里面的代码,看看是如何通过用户参数找到对应的生成器,然后生成器怎样生成那些模板文件的:
$:.unshift(File.dirname(__FILE__))
$:.unshift(File.dirname(__FILE__) + "/../../activesupport/lib")

begin
  require 'active_support'  
rescue LoadError
  require 'rubygems'
  gem 'activesupport'
end

require 'rails_generator/base'
require 'rails_generator/lookup'
require 'rails_generator/commands'

Rails::Generator::Base.send(:include, Rails::Generator::Lookup)
Rails::Generator::Base.send(:include, Rails::Generator::Commands)

# Set up a default logger for convenience.
require 'rails_generator/simple_logger'
Rails::Generator::Base.logger = Rails::Generator::SimpleLogger.new(STDOUT)

    这个文件先加载本地的active_support,如果本地没有就通过gem加载,然后给Rails::Generator::Base类中混入Rails::Generator::Lookup、Rails::Generator::Commands两个模块的功能,最后初始化Rails::Generator::Base中的logger,以便使用。
    Lookup类主要是用来通过用户输入的参数,查找对应的generator。比如本例中,我们要执行的命令是script/generate controller,那么Lookup将会通过controller这个参数,去加载rails_generator/generators/components/controller/controller_generator.rb这个文件,生成一个ControllerGenerator。
    到这里,我们先说一下generator的目录结构,看下图:generator有两种,一种是applications,我们上一次讲的生成整个app的框架时,调用的就是这里面的generator。另一种是components,可以看到我们平时常用的几个生成器都有对应的文件夹,看controller的文件夹会发现,除了有一个生成器之外还有一个templates文件夹和USAGE文件,templates文件夹里的文件就是通过controller_generator会生成的模板文件,从图上可以看出controller_generator会生成一个controller的文件一个功能测试,一个helper的测试,一个helper文件以及对应controller中action的view文件。USAGE文件是这个generator的使用说明信息。
    每个组件生成器都有对应的文件夹,里面都有templates和一个生成器,通过这些信息就能生成模板文件。

    Commands模块的功能主要是生成一个generator的委托,来完成generator的工作。Rails中有create,destroy,update,list几个命令,对应有Create,Destroy,Update,List这几种Generator Command。之前介绍过的在command文件夹下的generate.rb文件中,通过Rails::Generator::Scripts::Generate.new.run(ARGV)构造出的Generator会传递:command=>:create这个参数,那么Commands模块就会对应的生成一个Create类型的generator,它完成了创建目录,拷贝模板文件等工作。
    Generator Command的定义都在commands.rb文件中,每种Command都有对应的实例方法。这边不一一列举,大家可以自己看看源码。这些实例方法会在之后介绍的manifest方法中用到。
    到现在已经基本上把通过用户输入,找到对应的生成器并且生成模板文件的过程介绍完了。这个过程中涉及到的源码比较少,主要是讲解生成器的工作流程。之后将会通过源码来详细说明这个流程。

分享到:
评论

相关推荐

    rails-exporter-源码.rar

    五、源码学习步骤 1. 阅读项目 README 文件,了解基本用法和安装步骤。 2. 分析 models 文件,理解数据获取逻辑。 3. 研究 controllers 文件,查看如何触发导出操作以及如何调用模型和视图。 4. 查看 views 文件,...

    Rails项目源代码

    Rails的路由系统将URL映射到控制器的行动上,如`/sign_up`可能对应`users#new`,用于创建新用户。`config/routes.rb`文件定义了所有路由规则,包括资源路由、命名路由和自定义路由。 6. **视图模板**: 视图使用...

    ruby on rails 教程源码

    这个“ruby on rails 教程源码”很可能是为了辅助学习者深入理解Rails的工作原理和最佳实践,通过实际操作来提升技能。 在Rails中,`sample_app-master`可能是一个示例应用程序的主目录,它包含了完整的项目结构。...

    Rails进行敏捷Web开发(所有版本的源码rails3.0-4.0)

    Rails是Ruby语言的一个著名Web应用框架,以敏捷开发和“约定优于配置”...通过对这些版本的源码进行分析和学习,开发者不仅可以提升对Rails框架的理解,还能在实际项目中运用这些知识,编写出更高效、更安全的Web应用。

    rails查询学习笔记

    标签 "源码" 暗示了这篇笔记可能会涉及到一些实际的代码示例,读者可以通过阅读源码来理解和学习Rails查询的细节。而 "工具" 可能指的是Rails中用于辅助查询的工具或gem,如ActiveRecord的 scopes 和 relations,...

    Ruby on Rails源代码

    1. **路由系统**:Rails的路由负责将HTTP请求映射到控制器的行动上。源代码中的`config/routes.rb`文件定义了所有应用的路由规则。通过阅读源代码,你可以了解如何设置资源路由、命名路由、自定义路由以及如何处理...

    rails 的安装

    标题 "rails 的安装" 涉及到的是Ruby on Rails框架的安装过程,这是一个用于构建Web应用程序的开源框架。Rails是基于Ruby编程语言,它强调DRY(Don't ...学习和实践是掌握Rails的关键,祝你在Rails开发旅程中一切顺利!

    ruby_on_rails 源代码上

    在学习Ruby on Rails之前,首先需要理解Ruby的基本概念,如变量、数据类型、控制结构(如if语句、循环)、类与对象、方法定义、模块和块等。 2. **Rails框架** Rails框架提供了一套完整的工具集,用于快速构建Web...

    基于ruby on rails开发示例源码

    通过分析这个源码,你可以学习如何使用Rails创建控制器、模型和视图,如何定义路由,如何处理表单提交,如何使用ActiveRecord进行数据库操作,以及如何编写测试确保代码质量。此外,你还可以了解Rails的自动化工具,...

    ruby on rails社区网站开发源码

    在“ruby on rails社区网站开发源码”中,我们可以学习到如何利用Rails构建一个互动性强、功能丰富的社区网站。以下是一些关键知识点: 1. **安装与环境设置**:首先,你需要安装Ruby和Rails。这通常涉及设置Ruby...

    深入浅出Rails(中文版)

    《深入浅出Rails(影印版)》内容简介:通过此书,你将学习:希望你的网络应用超越平庸进入Web 2.0时代?《深入浅出Rails》将使你的编程和生产力达到最大值。你将学习一切Rails scaffolding的基本原理,以创建自定义的...

    influxdb-rails-源码.rar

    《InfluxDB与Rails集成深度解析——以influxdb-rails源码为例》 InfluxDB,作为一款专为时间序列数据设计的高性能数据库,被广泛应用于监控、物联网、大数据分析等领域。Rails,作为Ruby on Rails框架的核心部分,...

    Rails

    综合以上信息,学习和掌握Rails需要理解其核心组件和设计理念,熟练使用相关工具,阅读源码以加深对框架运作的理解,并通过实践项目来巩固理论知识。Rails是一个强大且高效的Web开发框架,它简化了许多常见的开发...

    Ruby on Rails Tutorial 3 源码

    本教程聚焦于 "Ruby on Rails Tutorial 3" 的源码,这个版本对应于 Ruby 2.2.1 和 Rails 4.2.6 的环境。在这个环境中,开发人员可以学习如何利用 Rails 的强大功能来开发实际的应用。 首先,Ruby 2.2.1 是一个稳定...

    Rails相关电子书汇总二

    标题中的“Rails相关电子书汇总二”表明这是一个关于Ruby on Rails框架的电子书籍集合,可能是对初学者到进阶者都有帮助的资源。Rails是基于Ruby语言的Web应用程序开发框架,以其“DRY(Don't Repeat Yourself)”...

    关于rails 3.1 cucumber-rails 1.2.0

    Rails 3.1 和 Cucumber-Rails 1.2.0 是两个在Web开发领域非常重要的工具,尤其对于Ruby on Rails框架的测试和自动化流程。本文将深入探讨这两个组件,以及它们如何协同工作来增强软件开发的效率和质量。 首先,...

    RailsGuides中那个blog程序源码

    总的来说,RailsGuides中的"blog"程序是学习Rails基础的一个理想起点,涵盖了MVC架构、数据库操作、路由配置、视图渲染、控制器逻辑等多个关键概念。通过分析和实践这个项目,开发者能够快速掌握Ruby on Rails的核心...

    Web开发敏捷之道--应用Rails进行敏捷Web开发 之 Depot代码。

    综上所述,这个压缩包提供的Depot项目是一个典型的Rails应用实例,适合初学者了解Rails框架的基本结构和敏捷开发流程。通过研究源码,开发者可以学习到如何组织代码、设置数据库、编写控制器逻辑、创建视图模板以及...

Global site tag (gtag.js) - Google Analytics