2011-06-14 68 views
2

我是rails新手,來自java企業web應用程序背景。我想創建幾個類,使您可以輕鬆地與暴露平安Web服務的外部應用程序進行交互。在Java中,我會簡單地創建這些無狀態的java beans/facade,它們返回的數據傳輸對象是很好用的對象,而不是醜陋的XML映射/數據。在Rails/Ruby中做這件事的最好方法是什麼?這裏是我的主要問題:在rails應用程序中實現java facade/service概念的最佳方式

門面類應該是靜態的還是應該在使用服務之前實例化它們?

DTO應該放在哪裏?

感謝, 皮埃爾

UPDATE:我們結束了使用服務,在這個答案解釋:Moving transactional operations away from the controller不適合作爲模型或控制器住在lib文件夾

+0

爲什麼不是這些類車型?你看過ActiveResource嗎? – Jeremy 2011-06-14 14:10:26

回答

1

代碼。 helpers通常僅用於生成HTML或其他UI相關結果的視圖相關代碼。

我一般會創建它們作爲實例化的常規類,並有實例方法來訪問外部休息服務 - 這可以使測試更容易。但這實際上只是一個偏好問題(也取決於每個請求需要多少狀態/重用這些對象 - 取決於你正在做什麼)。

在這種情況下,「DTOs」只是簡單的Ruby類 - 如果它們中沒有任何邏輯,則可能甚至是簡單的Struct實例。如果他們是Ruby類,他們會住在app/models,但他們不會擴大的ActiveRecord :: Base的(或其他任何東西)

0

你可能想看看httparty

這裏有一個如何的例子你會消耗Twitter的API。

# lib/twitter.rb 
require 'httparty' 
require 'hashie' 

class Twitter 
    include HTTParty 
    base_uri 'twitter.com' 

    def timeline 
    self.class.get("/statuses/public_timeline.xml")["statuses"].map do |status| 
     Hashie::Mash.new(status) 
    end 
    end 
end 


# client code 
client = Twitter.new 
message = client.timeline.first 
puts message.text 

請注意,您不必創建DTO。 httparty maps xml(看看這個例子中的結構的http://dev.twitter.com/doc/get/statuses/public_timeline),然後Hashie :: Mash將它們映射到方法,因此你可以做message.text。它甚至可以遞歸地工作,所以你可以做client.timeline.first.user.name。

如果你正在創建一個rails項目,那麼我會把twitter.rb放在lib文件夾中。

如果你想用靜態方法,你可以這樣做:

require 'httparty' 
require 'hashie' 

class Twitter 
    include HTTParty 
    base_uri 'twitter.com' 

    def self.timeline 
    get("/statuses/public_timeline.xml")["statuses"].map do |status| 
     Hashie::Mash.new(status) 
    end 
    end 
end 


# client code 
message = Twitter.timeline.first 
puts message.text 
相關問題