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

标签 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 响应的所有身份验证、获取、发布和解析的某个地方。我想将此逻辑保留在模型之外,因为它只会变得困惑,而且这些方法的行为确实有点超出我的应用程序的标准 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_apilib/facebook_api 也能正常工作。尽管我避免使用 /lib,但我确实喜欢您将这些项目限制在它们自己的目录中,以便它们在这方面具有凝聚力。

关于ruby-on-rails - 第三方集成代码放置的 Ruby on Rails 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24422157/

相关文章:

ruby-on-rails - Mongoid 命名空间模型,数据库中没有命名空间

ruby-on-rails - 激活 Ruby RAKE 10.0.1,需要 10.0.0

ruby-on-rails - 使用 pagey gem 对哈希进行分页

ruby-on-rails - Friendly_id 不为旧记录创建 slug

ruby-on-rails - 如何更改使用的默认 Rails 版本?

python - 从数据库加载大数据并转换为 JSON 时如何提高性能

jquery - ASP.NET MVC : Send back HTML inside Json object

ruby-on-rails - 将 Ruby on Rails 4 应用程序与 Phonegap 集成以构建原生 iOS 应用程序

javascript - 如何在 Jquery 中为每个循环增加 html 类名

ruby-on-rails - 工头:命令 "start"未定义