在學習rails時,我們有必要了解rails程序中的目錄結構。
rails對于不同的文件,不同的代碼存放在什么樣的文件目錄中有著明確要求。在rails中,有一條原則是:“慣例優于設置”(Convention Over Configuration),按照rails的約定去編程,往往能起到事半功倍的效果。
在這里,我們將對rails程序中的主要的文件及文件夾進行介紹。
一個具有MVC完整結構的目錄結構
首先,我們來看一個rails程序的目錄結構,這個目錄具有完整的MVC結構。我們通過tree
命令來查看程序的目錄結構:
vito@vito-HP:~/rails/test_of_rails/catalog_demo$ tree
.
├── app
│ ├── assets
│ │ ├── config
│ │ │ └── manifest.js
│ │ ├── images
│ │ ├── javascripts
│ │ │ ├── application.js
│ │ │ ├── cable.js
│ │ │ ├── catalog.coffee
│ │ │ └── channels
│ │ └── stylesheets
│ │ ├── application.css
│ │ └── catalog.scss
│ ├── channels
│ │ └── application_cable
│ │ ├── channel.rb
│ │ └── connection.rb
│ ├── controllers
│ │ ├── application_controller.rb
│ │ ├── catalog_controller.rb
│ │ └── concerns
│ ├── helpers
│ │ ├── application_helper.rb
│ │ └── catalog_helper.rb
│ ├── jobs
│ │ └── application_job.rb
│ ├── mailers
│ │ └── application_mailer.rb
│ ├── models
│ │ ├── application_record.rb
│ │ ├── concerns
│ │ └── user.rb
│ └── views
│ ├── catalog
│ │ └── catalog_test.html.erb
│ └── layouts
│ ├── application.html.erb
│ ├── mailer.html.erb
│ └── mailer.text.erb
├── bin
│ ├── bundle
│ ├── rails
│ ├── rake
│ ├── setup
│ └── update
├── config
│ ├── application.rb
│ ├── boot.rb
│ ├── cable.yml
│ ├── database.yml
│ ├── environment.rb
│ ├── environments
│ │ ├── development.rb
│ │ ├── production.rb
│ │ └── test.rb
│ ├── initializers
│ │ ├── application_controller_renderer.rb
│ │ ├── assets.rb
│ │ ├── backtrace_silencers.rb
│ │ ├── cookies_serializer.rb
│ │ ├── filter_parameter_logging.rb
│ │ ├── inflections.rb
│ │ ├── mime_types.rb
│ │ ├── new_framework_defaults.rb
│ │ ├── session_store.rb
│ │ └── wrap_parameters.rb
│ ├── locales
│ │ └── en.yml
│ ├── puma.rb
│ ├── routes.rb
│ ├── secrets.yml
│ └── spring.rb
├── config.ru
├── db
│ ├── development.sqlite3
│ ├── migrate
│ │ └── 20161030073918_create_users.rb
│ ├── schema.rb
│ └── seeds.rb
├── Gemfile
├── Gemfile.lock
├── lib
│ ├── assets
│ └── tasks
├── log
│ └── development.log
├── public
│ ├── 404.html
│ ├── 422.html
│ ├── 500.html
│ ├── apple-touch-icon.png
│ ├── apple-touch-icon-precomposed.png
│ ├── favicon.ico
│ └── robots.txt
├── Rakefile
├── README.md
├── test
│ ├── controllers
│ │ └── catalog_controller_test.rb
│ ├── fixtures
│ │ ├── files
│ │ └── users.yml
│ ├── helpers
│ ├── integration
│ ├── mailers
│ ├── models
│ │ └── user_test.rb
│ └── test_helper.rb
├── tmp
│ └── cache
│ └── assets
└── vendor
└── assets
├── javascripts
└── stylesheets
46 directories, 69 files
Rubymine中程序的目錄結構:
下面我們將基于這個目錄結構來介紹各個目錄及文件。
app/
app
目錄是rails程序中的主目錄,其中主要包括assets
、channels
、controllers(C)
、helpers
、jobs
、mailers
、models(M)
、views(V)
這幾個文件夾。我們看到,rails程序中的MVC的文件夾都存放在app
文件夾中,因此我們需要做的絕大多數工作都是在app
文件夾中進行的。
app/assets/
通常放置我們自己為了自己的程序所寫的js,css,或者是images文件,分別放在javascripts(js)
、stylesheets(CSS)
和images
文件夾下。
app/channels/
Action Cable
中的組件,Action Cable
結合WebSockets
來實現瀏覽器端實時的消息通知。一般情況下我們很少使用。
app/controllers/
rails程序中的控制器文件(controller層)一般都存放在這個文件夾下
app/helpers/
主要用來存放helper方法。在Rails中,Helper
指的是可以在Template
中使用的輔助方法,主要用途是可以將資料轉化成輸出用的HTML字串。每個控制器都可以有一個對應的Helper模塊,它在app/helper目錄下,與控制器文件同名。例如catalog_controller.rb
對應的helper
文件catalog_helper.rb
。當我們希望一個helper
方法是全局共享時,通常將該方法放在application_helper.rb
中。
app/jobs/
用來存放任務文件,確保任務文件繼承自 ActiveJob::Base即可。
Active Job 是用來聲明任務,并把任務放到多種多樣的隊列后臺中執行的框架。從定期地安排清理,費用賬單到發送郵件,任何事情都可以是任務。任何可以切分為小的單元和并行執行的任務都可以用 Active Job 來執行。
** Active Job 的目標**
主要是確保所有的 Rails 程序有一致任務框架,即便是以 “立即執行”的形式存在。
app/mailers/
用來存放實現發送郵件功能的文件。
Rails 使用 Action Mailer 實現發送郵件功能,郵件由郵件程序和視圖控制。郵件程序繼承自 ActionMailer::Base,作用和控制器類似,保存在文件夾 app/mailers 中,對應的視圖保存在文件夾 app/views 中。
app/models/
用來存放model文件(M層),例如user.rb
文件,這個User模型對應一個名為users的table(表),一個模型最多只能對應一張表(可以不對應表)。
app/views/
用命令生成controller
時,即
rails g controller catalog
會在app/views
文件夾下生成對應的一個文件夾,文件夾名稱與控制器名稱相同,在此文件夾下即可生成對應控制器的視圖文件,例如本例中的app/views/catalog/catalog_test.html.erb
文件。
bin/
存放運行程序的 rails 腳本,以及其他用來部署或運行程序的腳本。
config/
config
文件夾下主要包括environments/
、initializers/
、locales/
這三個文件夾和若干文件,主要是存放對rails程序進行配置的文件。
下面對部分重要的文件夾及文件進行介紹。具體的配置內容見這里。
config/environments/
rails程序的不同運行環境的配置包括:
- config/environments/development.rb 開發環境配置文件
- config/environments/test.rb 測試環境配置文件
- config/environments/production.rb 生產環境配置文件
config/initializers/
加載完框架以及程序中使用的gem后,Rails會加載初始化腳本。初始化腳本是個Ruby文件,存儲在程序的config/initializers文件夾中。初始化腳本可在框架和gem 載完成后做設置。
config/boot.rb
配置rails程序的Bundler以及加載路徑。
保存并加載可在命令行中執行的任務。任務在 Rails 的各組件中定義。如果想添加自己的任務,不要修改這個文件,把任務保存在 lib/tasks 文件夾中。
config/application.rb
根據不同的啟動環境(Rails.env)加載不同的rails gems, 配置應用程序。
config/environment.rb
執行所有啟動程序(initializers)。
config/boot.rb
、config/application.rb
、config/environment.rb
這三個文件都在啟動整個rails環境時加載。
config/routes.rb
rails程序的路由文件,添加路由時需要在此文件中添加。
config/database.yml
用來配置rails程序連接數據庫的文件,包括連接的數據庫類型、數據庫連接池限制數量等。
db/
存放當前數據庫的模式,以及數據庫遷移文件。
db/migrate/
用來存放數據庫的遷移文件。
db/development.sqlite3
當前程序連接的數據庫文件
db/schema.rb
這個文件用來記錄當前遷移的版本編號,同時匹配最新的數據庫結構。
db/seeds.rb
通過這個文件,可以直接把初始化數據存入數據庫。
lib/
程序的擴展模塊。
lib/assets/
通常是放置我們使用的插件中用到的assets。
lib/tasks/
Rake的任務一般存放在lib/tasks
目錄下。
log/
程序的日志文件。不同環境下會生成不同的日志文件,例如development.log
、production.log
、server.log
、test.log
,我們在開發時的信息都寫在development.log
里,而測試時的log都寫在test.log
里。
public/
唯一對外開放的文件夾,其他人可以直接訪問這個目錄中的東西。在這里存放于框架不進行交互的資源文件或網頁文件。與這個目錄相對應,app目錄中的內容是對外隱藏的。
test/
用于存放單元測試、功能測試及整合測試文件等測試文件。
temp/
臨時文件,例如緩存,PID,會話文件。
vendor/
存放第三方代碼。經常用來放第三方 gem。
vendor/assets/
通常是放置一些我們從別的地方借用的assets,比如說一些jquery插件。
config.ru
基于 Rack 服務器的程序設置,用來啟動程序。
Gemfile
用來指定程序所需的gem依賴件,用于Bundler gem。
Gemfile.lock
命令:
bundle install
執行后生成的文件,用來記錄當前使用的gem信息。依賴于Gemfile
。
Rakefile
保存并加載可在命令行中執行的任務。任務在 Rails 的各組件中定義。如果想添加自己的任務,不要修改這個文件,把任務保存在 lib/tasks 文件夾中。
這就是rails程序的目錄結構,明確每一個文件夾及文件的功能,對后面rails的學習開發是至關重要的,畢竟rails是“慣例優于設置”的,不同功能的文件放在對應的文件夾下,才更符合rails的開發。