Rails RESTful ActiveResource 先睹為快

在上一篇 Rails RESTful 相關工具 中有提到,ActiveReource 是一個針對 Rails RESTful APIs 所用的 client-side XML consumer,我們花了好幾篇學習為何 RESTful 跟如何用 map.resources 來架出 server-side provider,而具體的重大好處則會在 ARes 中體現出來,我們可以像對 ActiveRecord 的物件操作一樣來處理 ARes,只是它的內部運作對象變成 Resource 而不是 Database (你感覺不到你在用Web APIs :p)。

讓我們來試玩看看吧! 因為不只連 Rails 1.2 還沒 (最後關頭拉出 :p),連 Edge Rails 版都還沒有,所以必須直接用 svn co

svn co dev.rubyonrails.org/svn/rails/trunk vendor/rails

我們用 irb 來開始實驗吧~

$ irb
> require ‘vendor/rails/activesupport/lib/active_support’
> require ‘vendor/rails/activeresource/lib/active_resource’

上回也提到 beast 是個用 RESTful 開發的討論區軟體,所以我們用 beast 來做操作對象:

class User < BeastResource
end

class Forum < BeastResource
end

class Topic < BeastResource
site << ‘/forums/:forum_id’
end

class Post < BeastResource
site << ‘/forums/:forum_id/topics/:topic_id’
end

至此 Web APIs 就銜接起來了,非常簡單。接下來就是神奇的地方了,我們使用的方式就像操作 ActiveRecord 一樣:

讀取文章:

f = Forum.find 1
# notice that since Topic has a prefix, we must pass the forum_id.
# This is so it can make the request to /forums/1/topics/1.xml
t = Topic.find 1, :forum_id => f.id
p = Post.find 1, :forum_id => f.id, :topic_id => t.id
u = User.find p.user_id

甚至是張貼文章:

forums = Forum.find :all
testing = forums.detect { |f| f.name == ‘Testing’ }
# initialize takes two parameters in ActiveResource. One for the model parameters, and one for the prefix parameters.
topic = Topic.new({
:title => ‘Testing out ARes’,
:body => ‘Testing 1, 2, 3!’},
{ :forum_id => testing.id })

開始驚嘆 RESTful 的威力了嗎? 它將 Rails action 的 create,find,update,destroy 對應到 HTTP method 的 POST,GET,PUT,DELETE,當然最後又變成 SQL 的 INSERT,SELECT,UPDATE,DELETE,這就是 Resources on Rails 的 CRUD 哲學。

Model request Http REST operation request body Request URI Response
find(id) GET N/A /people/id.xml
   name 
save (update) PUT
   name 
/people/id.xml Status: 200 OK
save (create) POST
   name 
/people Location: http://x/people/id.xml
destroy DELETE N/A /people/id.xml Status: 200 OK
list GET N/A /people
        name    

其中傳輸格式使用XML,不過你也不用費心或看到XML,因為 ARes 也都處理好了。而在 server-side 部分,Rails 當然也不用你手動生成XML,新版 model 都可以用 .to_xml 自動生成 XML 格式,所以只需在 Controller 中寫好即可,例如:

def who_bought
@product = Product.find(params[:id])
@orders = @product.orders
respond_to do |accepts|
 accepts.html
 accepts.xml { render :xml => @product.to_xml(:include => :orders) }
end
end

Rails 1.2 還只是打開 REStful 時代的序幕,非常期待 ActiveResource 的正式推出,以後我會持續關注 ActiveResource 開發動態。

參考資料:

參與討論

2 則留言

發佈留言

發表迴響