问题描述
||
我是Rails环境的新手,来自Java企业Web应用程序背景。我想创建一些类,使您可以轻松地与公开宁静的Web服务的外部应用程序交互。在Java中,我将简单地将它们创建为无状态的Java bean / facade \,它们返回数据传输对象,它们是很好的可用对象,而不是难看的xml映射/数据。在Rails / Ruby中执行此操作的最佳方法是什么?这是我的主要问题:
Facade类应该是静态的还是应该在使用服务之前实例化它们?
DTO应该放在哪里?
谢谢,
皮埃尔
更新:我们最终使用了此答案中所述的服务:将事务操作从控制器移开
解决方法
不适用于模型或控制器的代码位于
lib
文件夹中。 “ 1”通常仅用于生成HTML或其他UI相关结果的视图相关代码。
我通常将它们创建为实例化的常规类,并具有实例方法来访问外部rest服务-这可以使它们的测试更加容易。但这实际上只是一个偏好问题(并且还取决于每个请求需要多少状态/重复使用这些对象-取决于您正在做什么)。
在这种情况下,\“ DTO \\”只是普通的Ruby类-如果它们中没有任何逻辑,甚至可能是简单的Struct实例。如果它们是Ruby类,它们将生活在app/models
中,但是它们不会扩展ActiveRecord :: Base(或其他任何东西)
, 您可能想看看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(在此示例中为该结构的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