# Rails组成与项目结构
Ruby on Rails框架是基于REST和MVC架构思想来设计的,那么让我们先看看Rails的组成结构,了解它是怎么实现这些思想的。
### Rails组成
当你用gem install rails命令安装Rails,你会发现它安装了很多的组件:
可以用gem list查看,这里把Rails核心组件列出来,其他的依赖就不说了。
~~~
actionmailer
actionpack
actionview
activemodel
activerecord
activeresource
activesupport
rails
railties
~~~
1.
actionmailer
专门提供email发送服务的一个框架。
1.
actionpack
包含了action dispatch ,action controller和 action view,用于Rails中控制器、路由和view层的交互。
1.
actionview
Rails4 中,从actionpack中独立出来,所以上面的actionpack在Rails4中只剩下action dispatch和action controller了。
1.
activemodel
独立于activerecord,处理model层的数据验证等逻辑,非数据存储,可以算是ORM的一个前端,你可以用它实现自己的ORM,比如开源的一个mongodb orm:mongoid
1.
activerecord
实现了零配置将Ruby类映射到数据库,我们用它来和数据库进行交互,它依赖于active model。
1.
activeresource
Rails4已经移除,Rails3中,用于消费REST api。
1.
activesupport
active support 中包含了一组工具类,以及对Ruby标准库的各种扩展,主要是为了给rails提供支持。 rails的其他组件都依赖于active support组件。
1.
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文件等。
- 序
- Chapter 1: 初识Chef
- 一些背景
- Chef vs Puppet
- Chapter 2: Chef应用
- Chef架构
- Chef能做什么
- Chef组件
- Chef环境安装
- chef-server
- opscode-chef
- chef-solo
- Chef实战
- 实战前的必修理论
- 使用Chef
- Chapter 3: Ruby基础
- 对象与方法
- 标识符
- 类与模块
- 数据类型
- 真与假
- 控制语句
- 代码块
- Chapter 4: Chef源码架构
- Rubygems与gem
- bundler
- Chef源码组织
- Chapter 5: Rails基础
- Rails是什么
- MVC架构
- Restful
- Rails组成与项目结构
- Chapter 6: Chef Server WebUI
- Chef Server Webui组织结构
- Chef Rest API
- 参考