Ruby on Rails第三方集成代码放置的最佳实践

时间:2014-06-26 04:00:25

标签: ruby-on-rails ruby json ruby-on-rails-4

我看过其他SO帖子和一些博客帖子,关于哪里最好放置第三方集成代码,但很自然地,有太多的意见和答案,所以希望能够通过我的方案获得更明确的答案。

以下是我的用户故事的快速细分:

当用户在他们的个人资料页面上时,他们可以要求刷新他们的Twitter和/或Facebook信息。

型号:

class User < ActiveRecord::Base
  has_one :twitter_account
  has_one :facebook_account
end

class TwitterAccount < ActiveRecord::Base
  belongs_to :user
end

class FacebookAccount < ActiveRecord::Base
  belongs_to :user
end

我在寻找: 当用户想要更新他们的Twitter帐户信息时,我希望能够调用一些方法,将返回的帐户信息返回给我。某处处理JSON响应的所有Auth,Fetching,Posting和Parsing。我希望将这个逻辑保留在模型之外,因为它会变得混乱,并且这些方法在我的应用程序的标准MVC之外真的有点像。

我一直在使用的当前实现是为每个Integration Entities在/lib中创建单独的类。所以/lib/twitter_api/lib/facebook_api。在这里,我保留了所有连接(GET,POST)以及从响应中提取我想要的数据。

也许这个方向适合我,但在我深入研究之前我只是想要一些反馈。

使用Ruby 2.1.1&amp; Rails 4.1.1

1 个答案:

答案 0 :(得分:5)

我不知道我是否可以采用“最佳实践”,但这是我如何处理第三方集成。

我对very much /lib使用/app感到有偏见。 如果代码与我正在运行的应用程序直接相关,那么我希望它在/lib中。如果代码与我的应用程序和其他应用程序相关,那么我希望它在gem中。一般来说,/lib中剩下的代码是简单易用的代码,或者尚未制作成宝石的代码。例如,如果我仍在确定代码的结构,我发现从/app比使用gem更容易做到这一点。我避免在/lib app/jobs中引用/app/models中的项目。

我首先要关注的是在主请求/响应流之外获取外部API调用。我不希望外部服务的响应时间很短,以至于我的应用程序反映不佳。在Rails中,这意味着我不会在控制器操作中对第三方服务进行API调用。相反,我的控制器立即将他们的请求作为后台作业注册,以便稍后处理,然后通知他们将对其进行处理。

我将后台作业的代码放在/lib/twitter_api中。我没有与Twitter和 Facebook,但我怀疑有宝石处理大多数连接和数据检索。作业代码将使用这些宝石检索数据,转换代码,然后更新ActiveRecord模型。

我认为数据转换是我的域模型的一部分。我会在lib/facebook_api下为该代码创建一个目录,以便它与ActiveRecord模型明确分开。该作业将引用此代码来执行转换。


我确信/lib和{{1}}也会有用。尽管我避免使用{{1}},但我确实认为您将这些项目限制在自己的目录中,以便它们在这方面具有凝聚力。