我是rails环境的新手,来自java企业Web应用程序背景。我想创建一些类,使您可以轻松地与暴露宁静Web服务的外部应用程序进行交互。在java中,我只是将它们创建为无状态java bean / facade,它们返回数据传输对象,这是很好的可用对象,而不是丑陋的xml地图/数据。在Rails / Ruby中执行此操作的最佳方法是什么?这是我的主要问题:
外观类是静态的还是应该在使用服务之前实例化它们?
DTO应该放在哪里?
谢谢, 皮尔
更新:我们最终使用了此答案中解释的服务:Moving transactional operations away from the controller
答案 0 :(得分:1)
不适合作为模型或控制器的代码位于lib
文件夹中。 helpers
通常仅用于生成HTML或其他UI相关结果的视图相关代码。
我通常将它们创建为实例化的常规类,并具有访问外部休息服务的实例方法 - 这可以使测试更容易。但这实际上只是一个偏好问题(并且还取决于每个请求需要多少状态/重用这些对象 - 取决于您正在做什么)。
“DTO”在这种情况下只是简单的Ruby类 - 如果它们中没有任何逻辑,甚至可能是简单的Struct实例。如果它们是Ruby类,它们将存在app/models
,但它们不会扩展ActiveRecord :: Base(或其他任何东西)
答案 1 :(得分: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将xml(看看本例中的结构http://dev.twitter.com/doc/get/statuses/public_timeline)映射到Hashes,然后将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