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发送服务的一个框架。

  2. actionpack

    包含了action dispatch ,action controller和 action view,用于Rails中控制器、路由和view层的交互。

  3. actionview

    Rails4 中,从actionpack中独立出来,所以上面的actionpack在Rails4中只剩下action dispatch和action controller了。

  4. activemodel

    独立于activerecord,处理model层的数据验证等逻辑,非数据存储,可以算是ORM的一个前端,你可以用它实现自己的ORM,比如开源的一个mongodb orm:mongoid

  5. activerecord

    实现了零配置将Ruby类映射到数据库,我们用它来和数据库进行交互,它依赖于active model。

  6. activeresource

    Rails4已经移除,Rails3中,用于消费REST api。

  7. activesupport

    active support 中包含了一组工具类,以及对Ruby标准库的各种扩展,主要是为了给rails提供支持。 rails的其他组件都依赖于active support组件。

  8. 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文件等。