# 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
- 參考