我看过其他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
答案 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}},但我确实认为您将这些项目限制在自己的目录中,以便它们在这方面具有凝聚力。