September 29, 2023

Viiisit [Ruby on Rails] - CoC & DRY!

#ruby on rails#ruby

講到 Ruby 大家一定也聽過 Ruby on Rails 或者 RoR,今天就來點 Ruby on Rails 吧!

Ruby on Rails 是什麼?

Ruby on Rails(簡稱RoR)是一個使用 Ruby 程式語言所開發出來的 Web Framework(網站應用程式框架)。作者是名為 David Heinemeier Hansson(DHH)的丹麥人。

Ruby on Rails 充分利用了 Ruby 的優勢,提供了一種快速、高效且優雅的方式來開發 Web 應用程式。
Ruby on Rails 的設計哲學是以 慣例優於設定 和 DRY(Don’t Repeat Yourself)原則為基礎,以提高開發速度和代碼的可讀性。

因此,我們來看看 Ruby on Rails 設計原則吧!

Rails 設計原則

在 Rails 裡,有兩個主要的設計原則:

Convention over Configuration (CoC) 慣例優於設定

Rails 強調慣例優於設定(Convention over Configuration(CoC))。
所謂的慣例就是當遇到某種情況的時候我們會用特定的方式來解決問題。
這些慣例幫助開發人員在不同項目之間保持一致性,並且使代碼更容易理解和維護。

Rails 的慣例 (CoC) 被應用在許多地方,以確保代碼的一致性、可讀性和簡潔性。
以下是一些應用了 Rails 慣例的地方:

  1. Model 模型命名:
    Model 模型命名使用單數形式,例如 Article 代表一個文章模型。

  2. Table 資料表命名:
    Table 資料表命名使用複數形式(通常是模型名稱的複數形式),例如 articles 資料表對應到 Article 模型。這種一致性使得 Rails 能夠自動映射模型和資料表。

  3. Controller 控制器命名:
    Controller 控制器命名使用複數形式,並以”Controller”結尾,例如 ArticlesController
    這使得 Rails 能夠自動識別控制器並與相應的路由配對。

  4. RESTful 路由:
    Rails 鼓勵使用 RESTful 路由,他定義了一組標準的 URL 結構來執行 CRUD 操作。
    這些路由命名通常符合慣例,如 indexshowcreateupdatedestroy 等。

    REST

    REST(Representational State Transfer)是一種軟體架構風格,主要用於設計網路應用程式的 API,有助於不同軟體和程式在網際網路中互相傳遞訊息。它基於資源(Resource)的概念,每個資源都有唯一的識別符號(URI),並且可以透過不同的 HTTP 方法(GET、POST、PUT、DELETE 等)來執行相應的操作。每個網頁都可視為一個資源,使用者可以透過 URL,也就是這些資源的地址,來取得資源並在瀏覽器上使用。

    Remark: URI - Uniform Resource Identifier,其中最常見的 URL 是 URI 的一種特殊形式,兩者都是用來唯一識別資源的地址。

    RESTful

    RESTful 是符合 REST 設計原則的 API。當我們在設計 API 時,遵循 REST 的原則,特別是適當地使用 HTTP 方法、URI 和回應狀態碼,我們就可以稱這個 API 為 RESTful API。
    RESTful 風格的網址設計強調從路由結構就能看出要對什麼資料進行什麼操作。在Ruby on Rails中,RESTful路由已經被設計為一種標準,透過Rails的路徑設定,可以快速地建立符合RESTful概念的路由,並使應用程序遵循RESTful架構來處理資源的CRUD操作。这讓開發人員能夠更容易地設計和理解API,並符合REST的最佳實踐。

    Remark: 所謂的 API 是應用程式介面 (application programming interface),網址也是一種應用程式的「介面」,故稱為 API。

  5. View 視圖:
    Rails 的 view 按照 controller(控制器)和 action(動作)的名稱組織在特定的目錄結構中,
    例如 views/articles 目錄包含了與 ArticlesController 相關的 view。

  6. Active Record:
    Rails 的資料庫抽象層 Active Record 使用一系列的命名慣例,
    如 Model 模型名稱對應到資料表名稱、外鍵的命名、時間戳記欄位等,這些慣例都可以自動產生 SQL 查詢。

  7. Partial view 部分視圖:
    Partila view 部分視圖通常以下底線開頭,如 _form.html.erb用於標識是可重用的 view。

  8. 路徑和文件結構:
    路徑和文件結構的組織也遵循慣例,例如放置 controller 控制器、 model 模型、view 視圖、migration 資料庫遷移文件的目錄結構都受到慣例的指導。


Don’t Repeat Yourself (DRY) 不要做重複的事 原則

Rails 遵循 “不要重複自己”(Don’t Repeat Yourself,DRY)原則。代碼應該盡可能地避免繁冗,並且相同的資訊應該只存在一個地方。

以下是 Rails 中應用 DRY 原則的地方:

  1. Models (模型):
    在 Rails 中,Model 模型代表資料庫中的表格,並使用 Active Record 來定義 Model 模型。
    DRY 原則在 Model 模型中定義一次模型的結構和資料庫表格的映射,
    而不必在多個地方重複相同的信息。

  2. Database Migrations(資料庫遷移):
    Rails 使用資料庫遷移來管理資料庫模式的變更。每個遷移檔案只包含一個變更,並按順序應用。

  3. Views(視圖):
    可以使用 partial view (部分視圖) 和 layouts(佈局)來避免重複的 HTML 代碼。
    部分視圖允許你定義一次,然後在多個視圖中重複使用特定的片段。

  4. Controllers(控制器):
    在 Controllers(控制器)中,可以使用共享的功能和方法來避免重複的代碼。
    例如,定義一個私有方法,在多個動作中共用這個方法,而不必多次編寫相同的代碼。

  5. Routes(路由):
    在 Routes(路由)中,可以使用命名路由(named routes)來引用特定的路徑,而不必在每個連接中硬編碼URL。這使得你可以在一個地方定義路由,然後在整個應用程序中重複使用。

    以下是一個實際的例子:

    假設有一個簡單的部落格,其中有一個文章(posts)資源,來定義幾個常見的路由,
    如文章列表、單篇文章頁面和新增文章頁面。

    首先,在 config/routes.rb 定義路由並指定名稱:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # config/routes.rb

    Rails.application.routes.draw do
    # 文章列表頁面
    get '/posts', to: 'posts#index', as: 'posts'

    # 單篇文章頁面
    get '/posts/:id', to: 'posts#show', as: 'post'

    # 新增文章頁面
    get '/posts/new', to: 'posts#new', as: 'new_post'
    end

    我們為每個路徑指定了名稱,如 postspostnew_post
    這些名稱代表了不同的路由,並且可以在整個應用程序中重複使用。

    當你需要在視圖或控制器中生成 URL 時,只需使用路由的名稱,而不必硬編碼 URL:

    1
    2
    3
    4
    # 在視圖中使用命名路由
    <%= link_to '查看文章列表', posts_path %>
    <%= link_to '查看文章', post_path(@post) %>
    <%= link_to '創建新文章', new_post_path %>

    可以看到 posts_pathpost_pathnew_post_path 分別引用了我們在路由中定義的命名路由。這使得代碼更具可讀性,並且在路由發生變化時更容易進行維護。

  6. 標準庫和Gem:
    Rails 附帶了一個豐富的標準庫,並且有許多 Gem 可用於擴展應用程序的功能。
    這些 Gem 通常遵循 DRY 原則,提供了可重用的代碼和功能。

    像是:

    • Devise: Devise 用於實現身份驗證和用戶管理功能。他提供了一個完整的用戶註冊、登錄、忘記密碼等功能的解決方案。通過安裝 Devise,你可以在應用程序中輕鬆添加用戶身份驗證,而不必自己編寫大量代碼。
    • CarrierWave: CarrierWave 是一個用於處理文件上傳的 Gem。允許你在應用程序中輕鬆管理用戶上傳的圖像、文件等。使用 CarrierWave,你可以在模型中定義文件上傳字段,然後自動處理文件上傳、存儲和圖像調整大小等操作。
    • Kaminari: Kaminari 是一個用於實現分頁功能的 Gem。允許你在 Rails 應用程序中輕鬆添加分頁功能,並提供了一個簡潔的 API 來處理分頁查詢。

參考資料: