Rails组成与项目结构
Ruby on Rails框架是基于REST和MVC架构思想来设计的,那么让我们先看看Rails的组成结构,了解它是怎么实现这些思想的。
Rails组成
当你用gem install rails命令安装Rails,你会发现它安装了很多的组件:
可以用gem list查看,这里把Rails核心组件列出来,其他的依赖就不说了。
actionmailer
actionpack
actionview
activemodel
activerecord
activeresource
activesupport
rails
railties
actionmailer
专门提供email发送服务的一个框架。
actionpack
包含了action dispatch ,action controller和 action view,用于Rails中控制器、路由和view层的交互。
actionview
Rails4 中,从actionpack中独立出来,所以上面的actionpack在Rails4中只剩下action dispatch和action controller了。
activemodel
独立于activerecord,处理model层的数据验证等逻辑,非数据存储,可以算是ORM的一个前端,你可以用它实现自己的ORM,比如开源的一个mongodb orm:mongoid
activerecord
实现了零配置将Ruby类映射到数据库,我们用它来和数据库进行交互,它依赖于active model。
activeresource
Rails4已经移除,Rails3中,用于消费REST api。
activesupport
active support 中包含了一组工具类,以及对Ruby标准库的各种扩展,主要是为了给rails提供支持。 rails的其他组件都依赖于active support组件。
rails & railties
上面的activerecord,actionpack,activesupport,activemodel,actionview,actionmailer都是gem形式存在,而rails是包含了它们这些组件的一个总的gem。
railties是用于粘合这些组件相互协同工作的组件,并且它还提供了生成器和rails的各种命令。
约定大于配置
Rails的一个先进理念,就是约定大于配置。也是Rails的核心原则,也是Raila开发效率提升的关键。 在Rails实现这个理念的若干年后,其他Web开发框架才反应过来,纷纷表示自己实现了约定大于配置。
那么约定大于配置在Rails中表现在哪?
数据库表名和model名单复数约定
比如: model是User, 那么Rails就会去找users表。 model是单数,数据库表是复数。
类名、模块名和文件查找
比如: 类名是User, 那么它一定对应文件名是user.rb。模块名是 Admin::User, 那么它一定对应于admin/user.rb文件。
通过这些约定,我们就省了不少配置,几乎达到了零配置。用JavaEE框架做过项目的朋友应该可以明白配置的痛苦。
controller会默认渲染对应名字的view
比如: controllers/users_controller 会自动的渲染 views/users.html.erb 这样的view文件。
RESTful: controller里面的action 默认响应HTTP 方法
比如:
- GET /users 会自动响应 index action
- PUT|PATCH /users/1 会自动响应 update action
- POST /users 会自动响应 create action
- DELETE /users/1 会自动响应 delete action
Migration 数据迁移脚本
比如:你创建一个数据迁移脚本 xxx_create_users.rb ,rails会根据这个名字帮你生成脚本文件。 稍后我们会见识到。
理解Rails的约定大于配置原则,对你Rails的学习有很大帮助。
Rails项目结构
我们使用rails new 命令创建一个新项目:
rails new reading
你也可以用指定版本号来创建一个项目:
rails _3.2.18_ new reading
当然,我们安装好Chef Server自动就已经有这个项目了。
一个默认的Rails(3.2.18)项目的目录结构如下:
app/
|_ assets/
|_ controllers/
|_ helpers/
|_ mailers/
|_ models/
|_ views/
config/
|_ application.rb
|_ database.yml
|_ environments/
|_ locales/
|_ boot.rb
|_ environment.rb
|_ initializers/
|_ routes.rb
config.ru
db/
|_ seeds.rb
doc/
|_ README_FOR_APP
Gemfile
Gemfile.lock
.gitignore
lib/
|_ assets/
|_ tasks/
log/
public/
|_ 404.html
|_ 422.html
|_ 500.html
|_ robots.txt
Rakefile
README.rdoc
script/
|_ rails
test/
|_ fixtures/
|_ functional/
|_ integration/
|_ performance/
|_ test_helper.rb
|_ unit/
tmp/
|_ cache
vendor/
|_ assets/
|_ plugins/
Rails 4.1 的项目结构有所变化:
script目录变成了bin,config里多了secret.yml
app/
|_ assets/
|_ controllers/
|_ helpers/
|_ mailers/
|_ models/
|_ views/
bin/
|_ bundle
|_ rails
|_ rake
config/
|_ application.rb
|_ database.yml
|_ environments/
|_ locales/
|_ secrets.yml
|_ boot.rb
|_ environment.rb
|_ initializers/
|_ routes.rb
config.ru
db/
|_ seeds.rb
doc/
|_ README_FOR_APP
Gemfile
Gemfile.lock
.gitignore
lib/
|_ assets/
|_ tasks/
log/
public/
|_ 404.html
|_ 422.html
|_ 500.html
|_ robots.txt
Rakefile
README.rdoc
test/
|_ fixtures/
|_ functional/
|_ integration/
|_ performance/
|_ test_helper.rb
|_ unit/
tmp/
|_ cache
vendor/
|_ assets/
|_ plugins/
虽然Rails3和Rails4的目录结构有一点变化,但总的思想是不变的。
Chef11 的server webui目前是Rails3写的,所以我们看Rails3就够用了。
app目录
app目录的作用是组织REST架构和MVC架构的相关代码。也是Rails项目启动文件默认加载的目录。
assets 目录:包含了前端的资源,javascript、css、images。
controllers目录:包含了所有的controller,在Rails中一般controller就是指REST架构中的资源。controller里实现了各种action,用于响应web请求。 也是MVC架构中的C层。
helpers目录: 用于存放一些helper方法,这些helper方法一般用在view层,用于组织一些用于view的逻辑代码。
mailers目录: 用于放和邮件发送相关的代码。
models目录: 用于放各种数据库映射的model,一些数据操作以及业务逻辑代码,都应该放在这里。 MVC架构中的M层。
views目录: 用于放views层的模板,经过controller渲染这些模板,最后生成可供用户访问的页面。MVC架构中的V层。
bin目录 (或Rails3 中的script目录)
Rails的命令,以及bundle、rake命令。
config目录
这里配置Rails项目的运行规则。
application.rb 文件,用于配置你的Rails项目运行的各种参照、状态。
database.yml 文件用于配置你的数据库连接驱动及信息。
boot.rb 用于load bunler环境,加载依赖gem
environment.rb 初始化Rails应用
environments目录,包含了Rails预设的三种状态,development、production、test。
这三种状态,对应不同的环境,development为开发环境,production为生产环境,test为测试环境。 我们开发的时候一般用development环境,部署到线下,需要用production环境, 做单元测试的时候,就是用测试环境。 这三种环境对应的rails应用的配置有所不同。
locales 这个目录包含用于国际化的yml配置文件。
secrets.yml 这个文件默认存有应用程序的 secret_key_base,也可以用来存放其它 secrets,比如存放外部 API 需要用的 access keys。
initializers 目录,这个目录存放着一些rails的启动文件,这些文件是rails默认对外开放,意味着你可以在里面添加一些东西,来改变rails的启动状态。你还可以在这个文件夹下面放置你自己的启动文件。
- routes.rb, 这个文件是Rails中最重要的一个文件之一,因为这个文件中指定了你项目所有的路由配置,也就是说,所有的web请求收发规则,都由这里指定。
config.ru 文件, rackup启动所需要的一个配置文件
db 目录
这个目录存放的东西,主要是数据库相关。 seeds.rb 用于初始化应用数据。 将来用于创建数据库表结构的migration脚本文件,也会放到这个目录下面。 以及创建完数据库表生成的schema文件。
Gemfile
这个是bundler工具提供的,管理项目中用到的gem依赖。Rails启动应用会先从这个文件中加载。
bundle install 命令,帮助你安装所有的gem依赖。 然后会生成一个Gemfile.lock文件。
lib目录
用于存放第三方库。
tasks目录,用于存放rake 任务。
assets目录,用于存放我们自己代码库或者共用代码的静态资源。
public
这个目录用于web服务器,而非应用服务器,这个目录作为web服务器的根目录。
其他目录
doc目录,用于存放项目的文档。
vendor目录,用于存放第三方资源,assets和plugins。
log目录, 日志输出的目录。
tmp 目录,用来存放暂时用途的文件,比如文件上传的临时文件等。
.gitignore 此文件用于配置不想或不能加入到git版本控制系统中的文件,比如database.yml , secrets.yml文件等。