推薦 Rails Code Review PDF

Update: 原作者有摘要在 Massive List of Rails Development Tips一文

推薦 peedcode.com 上的 Rails Code Review PDF,廢話不多蠻實用的,一路看下來馬上學到好幾招跟不錯的工具,簡單走訪一下:

Store Sessions in the Database

用 ActiveRecord 存 Sessions 在 AWDwR 第二版都已經變成入門範例了,不過這裡提供的 Rake code 不錯用,幫你清除資料庫中過期兩週的Sessions 。

Use Custom Configuration Files

別把 config 統統扔到 environment.rb,可以拆成獨立的 YAML 檔案。也因此可以不必將 production mode 才用到的設定檔(如API密碼等)丟進 repository, 搭配 Capistrano 在 deploy 的時候從複製過來就可以了,

Use Constants for Repeated Strings

Keep Time in UTC

一開始就用 UTC 當預設時區

Don’t Loop Around ActiveRecord

ActiveRecord 跑迴圈的時候小心產生一筆一筆 SQL queries 啊,請愛用 :include 一次就把(子)資料讀出來,而不是一筆筆去捅資料庫。甚至直接寫點 SQL conditions,目標是讓 SQL query 一次即可。若要用 :select 請搭配 :join。

Beware of Binary Fields

若欄位有 Binary data,用 find 時請務必愛用 :select 只讀出必要欄位。另外也建議使用 with_scope method 或 scope_out plugin

Cache Your Reports

Store Country Lists

別用 Rails 內建的 country_select,自己寫 Model才有彈性。

Avoid Bloated Controllers

RESTful 對 controller 的建議: 別塞太多 action 在一個 controller 裡。

Keep Your Controllers and Views Skinny

實在是 Rails 的原罪: 因為 ActiveRecord 提供很多好用的 method,所以我們習慣把 code 塞到 controller 甚至 view 裡。正確的作法應該盡量重構至 Model 中 (例如有複雜參數的 find ),有可讀性、可測試(model unit testing)跟好的MVC。請看這篇經典文章 Skinny Controller, Fat Model。這裡作者又在推薦了一次 with_scope

Don’t Store Objects in the Session

別這樣做 session[:user]=user,你的memory很快用完,而且session資料跟db資料不一致,請用 session[:user_id] = user.id。真要存 object 請裝 Memcached 吧。

Avoid Heavy Response Processing

耗用時間的操作請用 queuing system,入門方法可用 rake 跟 crob 自動執行,進階有 BackgroundRB, Amazon’s SQS 等。可以試試 acts_as_state_machine 這個 plugin 來設計自己的排程系統。

Use ActiveRecord Mailing

寄送大量郵件,介紹 ar_mailer plugin

Monitor Your Servers

最基本的 exception_notification plugin 是 production mode 必裝,一旦發生例外會寄信告知你。作者還介紹了一堆工具。

Don’t Cut Costs on Hardware

Test-Drive

The Rest of the List

  • 使用 database indexes
  • Profile your code: ruby-prof gem
  • 不一定要裝大的 ImageMagicK,有小巧的 mini-magick 或 image_science 就可以縮圖了。
  • 使用 attr_protected 來保護重要欄位
  • Automate deployment: 使用 Capistrano or Vlad

One thought on “推薦 Rails Code Review PDF

Leave a Reply