我查看了其他 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 响应的所有身份验证、获取、发布和解析的某个地方。我想将此逻辑保留在模型之外,因为它只会变得困惑,而且这些方法的行为确实有点超出我的应用程序的标准 MVC。
我一直在使用的当前实现是在 /lib
中为每个集成实体创建单独的类。所以 /lib/twitter_api
和 /lib/facebook_api
。在这里我保留所有连接(GET、POST)和从响应中提取我想要的数据。
也许这个方向适合我,但我只是想在深入了解之前得到一些反馈。
使用 Ruby 2.1.1 和 Rails 4.1.1
最佳答案
我不知道我是否可以谈论“最佳实践”,但这是我处理第三方集成的方式。
我偏向于将 /lib
用于 very much .
如果代码与我正在运行的应用程序直接相关,那么我希望它位于 /app
中。如果代码与我的应用程序和其他应用程序相关,那么我希望它在 gem 中。通常,留在 /lib
中的是非常简单的代码或尚未成为 gem 的代码。例如,如果我仍在确定代码的结构,我发现从 /lib
比从 gem 更容易做到这一点。我避免从 /lib
引用 /app
中的项目。
我首先关心的是在主要请求/响应流程之外获取外部 API 调用。我不希望外部服务的不良响应时间影响我的应用程序。在 Rails 中,这意味着我不会在 Controller 操作中对第三方服务进行 API 调用。相反,我的 Controller 立即将他们的请求注册为后台作业以供稍后处理,然后通知他们它将被处理。
我将后台作业的代码放在 app/jobs
中。我还没有与 Twitter 集成,并且
Facebook,但我怀疑有 gem 可以处理大部分连接和数据检索。作业代码将使用这些 gem 检索数据、转换代码,然后更新 ActiveRecord 模型。
我认为数据转换是我领域模型的一部分。我会在 /app/models
下为该代码创建一个目录,以便它与 ActiveRecord 模型明确分开。该作业将引用此代码来执行转换。
我确定 /lib/twitter_api
和 lib/facebook_api
也能正常工作。尽管我避免使用 /lib
,但我确实喜欢您将这些项目限制在它们自己的目录中,以便它们在这方面具有凝聚力。
关于ruby-on-rails - 第三方集成代码放置的 Ruby on Rails 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24422157/