投影片:Practical Rails2

釋出今天在OSDC的投影片,下載PDF請按此。題目雖然定成 Practical Rails2,但主要的內容是談 RESTful Rails 實做。

有了上禮拜在 HappyDesigner3 的經驗,這次試著講慢一點,應該有穩一點。
(開始前挺緊張的,結果人一半跑到隔壁聽 Keroro 桌面,瞬間壓力減輕不少 XD)
準備的投影片到上台前有了150張,本來還擔心會不夠,結果還講不完,只好跳掉了兩個自己寫的 Rails Plugin 介紹… :p

well, 請多指教 :>

補充: 傳到 sliceshare 後,發現旁邊的相關投影片有一份 RESTful best practices也值得一看 (如果你還有興趣的話…XD)。

小探 Rails ActiveSupport

Update(2008/4/9): 這篇 RAILS RUBYISMS ADVENT也可以一看。

ActiveSupport 是 Rails 的工具箱。最近在看 Advanced Rails, O’Reilly 一書,有幾樣東西值得記上一筆:

JSON

我們有 Object#to_json,物件如 array,hash 等都可以呼叫 to_json 轉 JSON 格式,非常方便與 JavaScript 做銜接。

Blank

所有的物件都加上了 blank? 這個函式,回傳 true 如果是 1. 空字串 2. 只含空白的字串 3. false 4. nil 5. empty array [] 6. empty hash {}。所以別再寫 ( s.nil? || s.empty? ) 啦。

Class Attribute Accessors

可用宣告的方式定義 Class Attribute,如

  class Foo
     cattr_accessor :bar
     self.bar = ""
  end

這樣會定義出來的 C.bar 即 @@bar

Class Inheritable Attributes

Class Attribute 是整個類別繼承體系共用,這在我們寫 ActiveRecord 相關 plugin 時非常不適用,因為所有的 model 都繼承自 ActiveRecord,但是各自又要有不同的 Class Attributes 值。最常見的使用狀況就是 plugin 了,model A 和 model B 都 include 某個 plugin,但是這個 plugin 的設定值要不一樣。拿大家都在用的 attactment_fu 舉例:

class UploadImage < ActiveRecord::Base
  has_attachment :content_type => :image, :storage => :file_system
end

翻出 has_attachment 的 source code 你就看到這招了:

def has_attachment(options = {})
      ......
     class_inheritable_accessor :attachment_options
     self.attachment_options = options    # 這裡的 self 指的是 UploadImage
      ......
end

除了 class_inheritable_accessor(syms) ,還有 class_inheritable_array(syms) 和class_inheritable_hash(*syms) 等。

Class Attribute Accessors 的原理可以請參考 class instance variables 這篇。

Date and Time conversions

不需要每次寫 Helper 用 strftime,我們可在 environment.rb 新增自訂的 format,例如

 ActiveSupport::CoreExtensions::Time::Conversions::DATE_FORMATS.merge!( :foo => '%m/%d %l:%M %p')

這樣就可以對 Time 物件呼叫 to_s(:foo),內建還有 :default, :short, :long, :db 等等。

alias_method_chain

在 Rails source code 十分常見:

  alias_method_chain :target, :feature

等同於

  alias_method :target_without_feature, :target
  alias_method :target, :target_with_feature

Delegation

將 methods 傳給另一個 object

  class Account < ActiveRecord::Base
      has_one :foo
      delegate :free?, :to => :foo
  end

這樣 account.free? 就會呼叫 account.foo.free? 考慮 foo 可能 nil,我們可以多一個檢查:

  delegate :free?, :to => "something.nil? ? false : something"

甚至兩層,假設 foo 有 bar:

  delegate :free?, :to => "foo.bar"

這樣 account.free? 就會呼叫 account.foo.bar.free?

#Object#returning

讓你執行一些操作然後傳回:

 returning(User.new) do |u|
   u.name = "Foo"
 end

#Object#with_options

最常用在 routes.rb,不過其實任意物件都可以用,他會將參數自動 merge 到 method call 的 hash 參數:

 map.with_options( :controller => "people" ) do |p|
   p.root :action => "index"
   p.about :action => "about"
 end

全文搜尋 Sphinx on Rails

Update(2009/3/31): 除了 ultrasphinx 之外,還有一套 Ruby library 是 thinking sphinx 目前已經是最被推薦的 Rails 套件,我也推薦改使用 thinking sphinx,peepcode 有出它的 PDF

雖然在 Ruby/Rails 圈比較常聽到 Ferret,不過這隻雪貂的穩定度一直為人所詬病。我在 survey Rails 全文搜尋方案的時候,看到另一個有 Rails plugin 支援的開放源碼全文搜尋引擎 Sphinx,搭配的 Rails plugin 叫做 Ultrasphinx

Sphinx 的特點在於它直接存取 MySQL (或PostgreSQL),完全獨立於 Rails app。它不像 acts_as_ferretacts_as_solr 使用 rails callback 來做新資料的索引動作,而是設定 crontab 定期跑 indexer (如每半小時),大大提高了 search daemon 穩定度(反之亦然),也不太有索引資料損壞的問題(在講ferret?)。目前看到的評價也都是穩穩穩高效能,用過就不想再用 Ferret 了。Ultrasphinx 的作者也有 benchmark 數據可供佐證。

閱讀全文〈全文搜尋 Sphinx on Rails〉

出清電腦書 (2008)

Update(2009/2/4): 新增 jQuery in Action
Update(2008/5/22): 新增幾本 CSS/Javascript 書
Update(2008/3/26): 郵資加 70 元(郵局包裹)

之前買的好書放了好一陣子沒時間看,出清給會念的人好了。書況都很新沒有劃線,只有翻閱過幾次(?)而已。書名後的數字就是直接購買價,請直接寫 E-mail ihower {at} GMail.com 給我,不放心的話可以透過Y!拍賣下定(價格以 Y! 為準,懶得更新下面的價格了)

Web design

  1. Web Accessibility $1200
  2. Web Standards Programmer’s Reference $900
  3. CSS Instant Results $250
  4. designing web graphics.4, 4/e $450
  5. Bulletproof Web Design $300
  6. Ajax Patterns and Best Practices $650
  7. jQuery in Action $900
  8. Beyond Borders: Web Globalization Strategies $700

UI

  1. Access by Design $500
  2. About Face 2.0: The Essentials of Interaction Design $650
  3. Experience Design $450
  4. Fresh Style for Web Designers $250

Security

  1. Professional Pen Testing for Web Applications $900
  2. Mastering FreeBSD and OpenBSD Security $750
  3. Security and Usability $800
  4. 駭客訓練基地 $250
  5. 初探網路安全 first-step $250

Object,UML…etc

  1. Applying Use Cases: A Practical Guide (2nd Edition) $550
  2. UML 使用手冊 $300

Other

  1. Developing Feed with RSS and Atom $650
  2. WebDAV $800
  3. BSD Hacks $450
  4. Capacity Planning for internet Services $400
  5. Postfix 技術手冊 $350
  6. POSTFIX 技術手札 $300
  7. Postfix 郵件伺服器白皮書 $300
  8. Google 廣告工具 $300
  9. CGI Programming with Perl $400
  10. 多平台環境系統管理 $300
  11. Local and Metropolitan Area Networks (6th Edition) $250

PHP

  1. PHP in a Nutshell $300
  2. 真PHP5技術手札 $150

Textmate on Rails 2

Rails on Rails 已經出到 2.0 了,不過 Textmate 內建的 Bundle 還是 1.x,需要更新。請下載 Textmate bundle,最好的方式是用 git,不過也可以直接下載放到 [~/Library/Application Support/TextMate/Bundles] 下,並命名為 Ruby on Rails.tmbundle,然後在 textmate 裡 reload bundle 即可。

另外也請在 [/Applications/TextMate.app/Contents/SharedSupport/Support/lib] 執行 mv Builder.rb Builder.rb.off (不然某些用到 rake 的 bundle 會有錯誤)。

來背指令吧~列了幾個自己想要記下來用的。

Ctrl+command + T : 查詢 bundle 指令

閱讀全文〈Textmate on Rails 2〉