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方法中用到。
到现在已经基本上把通过用户输入,找到对应的生成器并且生成模板文件的过程介绍完了。这个过程中涉及到的源码比较少,主要是讲解生成器的工作流程。之后将会通过源码来详细说明这个流程。
分享到:
- 2009-07-10 17:24
- 浏览 2310
- 评论(0)
- 论坛回复 / 浏览 (0 / 2434)
- 查看更多
相关推荐
《深入浅出Rails(影印版)》内容简介:通过此书,你将学习:希望你的网络应用超越平庸进入Web 2.0时代?《深入浅出Rails》将使你的编程和生产力达到最大值。你将学习一切Rails scaffolding的基本原理,以创建自定义的...
ruby_on_rails 开发者实战 源代码上 1-12章 来之不易啊。仅供学习.
NULL 博文链接:https://citi21558541.iteye.com/blog/437132
NULL 博文链接:https://wikimo.iteye.com/blog/622212
mini-rails实现了从套接字到控制器的层层封装,并注释了Rails源码中相应模块的位置,可作为学习Rails源码的目录或大纲; Socket -> WEBrick GenericServer -> WEBrick ...
NULL 博文链接:https://yiditushe.iteye.com/blog/361584
适合二次开发和学习使用,都是经典游戏,需要其他游戏源码包可以看我主页。 直接可以运行 , 如果运行不了 请切换编译器版本 2021 3.14版本编译器测试没问题 其他版本请自行尝试。 有别的资源或代码需求可以通过我的...
coursewa.re, 开放源码学习管理系统 课件项目 课件是用 ruby ( Rails ) 编写的学习管理系统。在 10th 2013年月 上开放了课件。 如果你有一些 private 版本资产/设置,那么我们可以以修复问题,这样我们可以以修复...
学习ruby的好帮手,包括ruby on rails 等,有兴趣看看,有助于初学者入门学习
NULL 博文链接:https://aideehorn.iteye.com/blog/290165
java党建平台源码 Ruby & Rails 学习资源 [在线 YAML 解析器](Online YAML Parser) 好文共分享 [Ruby 与多态](Polymorphism and Ruby) 书籍推荐 由于 ruby 和 rails 的版本迭代都很快,这就导致很多出版的 ruby 书籍...
NULL 博文链接:https://umeit.iteye.com/blog/1137388
最早是因为在使用Google安卓架构组件的时候,存在一些涉及网络请求的demo,自己不上手写,总感觉不踏实。又不想重新去搞java ee,一回想,去年的rails还有点印象,要不这下自己来试试。买好书,一点一点来看。 书是...
免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,...
rforum代码,学习RUBY ON RAILS的绝好源码
内容索引:Java源码,初学实例,二进制,文件复制 Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java...
java8集合源码边干边学 Mackenzie Child 的视频给了我很大的启发。 所以我决定按照他所有的 rails 视频教程来学习如何构建一个 Web 应用程序。 通过视频,我会尝试自己构建Web应用程序,并将课程逐步记录在文本中,...
笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!此时此...
ruby_on_rails书里面的源代码,代码太大了,这是第二部分.资料仅供学习参考
自述 此自述文件通常会记录启动和运行应用程序所需的任何步骤。 您可能想要涵盖的内容: Ruby版 系统依赖 配置 数据库创建 数据库初始化 如何运行测试套件 服务(作业队列、缓存服务器、搜索引擎等) ...