在上一篇 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
endclass Forum < BeastResource
endclass Topic < BeastResource
site << ‘/forums/:forum_id’
endclass 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 |
|
save (update) | PUT |
|
/people/id.xml | Status: 200 OK |
save (create) | POST |
|
/people | Location: http://x/people/id.xml |
destroy | DELETE |
N/A | /people/id.xml | Status: 200 OK |
list | GET |
N/A | /people |
|
其中傳輸格式使用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 開發動態。
參考資料:
發佈留言