Rails 的「慣例優於配置」核心哲學,極大程度依賴命名慣例自動推斷類別、表名、檔案路徑、關聯關係等。掌握慣例能讓你少寫大量配置程式碼,並與框架順暢協作。
| 元素 | 慣例 | 範例 |
|---|---|---|
| 資料表 | 小寫、底線分隔、複數 | orders, line_items, third_parties |
| 模型類別 | 駝峰式、單數 | Order, LineItem, ThirdParty |
| 模型檔案 | 小寫、底線分隔、單數 | order.rb, line_item.rb |
| 控制器類別 | 駝峰式、單數 + Controller | StoreController, Admin::ProductsController |
| 控制器檔案 | 小寫、底線分隔、單數 + _controller.rb | store_controller.rb, admin/products_controller.rb |
| 視圖目錄 | app/views/控制器名(不含 Controller) | app/views/store/, app/views/admin/products/ |
| 佈局檔案 | app/views/layouts/控制器名.rhtml | store.rhtml, admin.rhtml |
| Helper 模組 | 駝峰式 + Helper | StoreHelper, Admin::ProductsHelper |
| Helper 檔案 | 小寫、底線分隔 + _helper.rb | store_helper.rb, admin/products_helper.rb |
| Migration 檔案 | 時間戳 + _描述.rb | 20240114120000_create_orders.rb |
Rails 依慣例將類別名轉換為檔案路徑並自動 require:
# 程式碼中首次引用 LineItem
LineItem.new # 自動載入 app/models/line_item.rb
# 引用 Admin::ProductsController
# 自動載入 app/controllers/admin/products_controller.rb
原理:const_missing 回呼將常數名(LineItem)轉為底線命名(line_item),在載入路徑中尋找對應 .rb 檔案。
將模型物件存入 Session 時,類別必須預先載入,否則反序列化失敗。在控制器宣告:
class StoreController < ApplicationController
model :line_item # 強制載入 LineItem 類別
end
大型專案可將控制器歸類至模組,避免命名衝突:
# 請求 URL: /admin/books
# 對應控制器: app/controllers/admin/books_controller.rb
class Admin::BooksController < ApplicationController
end
# 請求 URL: /content/books
# 對應控制器: app/controllers/content/books_controller.rb
class Content::BooksController < ApplicationController
end
產生器指令:
ruby script/generate controller Admin::Books index show
ruby script/generate controller Content::Books index show
模型名_id(如 user_id, line_item_id)可多型名_type, 可多型名_id(如 commentable_type, commentable_id)關聯名_count(如 comments_count)id(可用 set_primary_key 覆寫)| 測試類型 | 目錄 | 檔案命名 |
|---|---|---|
| 單元測試 | test/unit/ | model_name_test.rb |
| 功能測試 | test/functional/ | controller_name_controller_test.rb |
| 整合測試 | test/integration/ | feature_name_test.rb |
| Fixtures | test/fixtures/ | table_name.yml |