Rails RESTful 相關工具

Update(2008/5): 事隔一年多,我對於 RESTful Rails 有完全不同的切入點,詳見 Practical Rails2 投影片。本篇的 Resource Generator 和 simply_helper 皆已內建在 Rails2 中。

Rails RESTful  第四篇,我在這裡做些 Rails RESTful 工具介紹,相關文章有 REST tools for Rails 1.2

Resource Generator

Rails 的 Generator 是最立即的學習教材,因此 RESTful 版的 generator 也有了,除了產生 model, controller, views, tests 之外,連 migration 也會產生。

ruby script/generate scaffold_resource person name:string age:integer created_at:datetime birthday:date

simply_helper 

搭配 Rails 1.2 使用的 helper plugin,有 rendering collections、搭配 RJS 使用的 autogenerate DOM ID 以及搭配 RESTful 使用的超簡化 form blocks 等。

本來的 render :partial => ‘venue’, :collection => @venues 可以用更簡單的縮寫語法,Ruby 會自動迴圈代入 venues/_venue.rhtml 樣板 :

render :partial => @venues

dom_id 將根據傳進的 object’s class 跟 database ID 產生一個 HTML ID,例如 dom_id(@person) 將會產生 person_123,如果還未存進資料庫,則會產生 new_object_name。

dom_id(object, prefix = nil)

這個小玩意有什麼用? 這主要用在 RJS 上,他讓你可以方便參照到 DOM objects,例如以下三行是等價的:

page[:person_123]
page[dom_id(@person)]
page[@person]

另外 dom_class(object) 則會根據 object’s class 產生一個 CSS class name,不過用處似乎不大就是了。

form_for @post do |f|

超簡潔的表單生成,新增跟編輯通用。它會根據 @post 是否已經存在資料庫來決定 action (POST或PUT),也會生成 DOM id 跟 css class name。這用法比 RESTful generator 產生的版本用法更簡潔,generator 的原始版本如下(結果一樣,除了不會產生DOM id跟class name):

#新增
form_for(:post, :url => posts_path) do |f|
#編輯
form_for(:post, :url => post_path(@post), :html => { :method => :put }) do |f|

Restful Authentication Plugin

RESTful 版的網站登入功能,它把 users 跟 session 當成兩個 Resource。除了用一般登入機制(用瀏覽器填寫登入表單,然後用Session判斷是否登入了) 之外,也加入 HTTP Basic Authentication 認證機制 (若HTTP Request 的 header 中有 username 跟password的話,會算登入狀態)。

根據RESTful的理念,應該是完全用 HTTP Authentication 才是,不過我認為提供 HTTP Authentication 最重要功能是 Web API 可以有認證,讓其他 machine client (非使用者瀏覽器) 只要在 HTTP Request 的 header 上加上 username 跟 password 就可認證存取資源。至於降低 Server 負擔的優點似乎不是很明顯(反正大家也都用session這麼久了)。所以為了網站的 usability 跟有漂亮的HTML登入表單,要給瀏覽器使用者登入就不喜歡用 HTTP 認證了 (這一定會跳瀏覽器自己的認證視窗吧?)

By the way,網頁要用 HTTP Authentication (會產生瀏覽器認證視窗) 的話有官方 plugin,請見 What’s New in Edge Rails: New Http Authentication Plugin – And a Plea to Contribute

ActiveResource

上一集開場的 DHH 投影片 Discovering a world of Resources on Rails 最後提的壓軸應用,用來存取 REST Resource,達到 RESTful 的極致發揮。它提供 RESTful 系統中 client side 的功能,將遠端的 REST services 代理成本地的 model object。本來要對本地資料庫操作的 CRUD 改成對遠端用 POST/GET/PUT/DELETE,更多可以參考 What’s New in Edge Rails: The Ins and Outs of ActiveResource 這篇。可惜的是這東西還趕不及加入 Rails 1.2,看起來還得等一陣子,我認為這將是 Rails RESTful 的殺手級應用。

Update(2006/12/13): 加寫一篇 Rails RESTful ActiveResource 先睹為快 可以看看實際用法。

Beast Forum

一個用 RESTful 開發的討論區軟體,source code 我想也許可以參考看看。

參與討論

2 則留言

發佈留言

發表迴響