【问题标题】:Ruby on Rails Best Practices For Third Party Integration Code PlacementRuby on Rails 第三方集成代码放置的最佳实践
【发布时间】:2014-08-16 19:30:09
【问题描述】:

我查看了其他 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。

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

也许这个方向是我要走的路,但我只是想在深入了解之前得到一些反馈。

使用 Ruby 2.1.1 和 Rails 4.1.1

【问题讨论】:

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


    【解决方案1】:

    我不知道我是否可以谈论“最佳实践”,但这是我处理第三方集成的方式。

    我不赞成将/lib 用于very much。 如果代码与我正在运行的应用程序直接相关,那么我希望它在/app 中。如果代码与我的应用程序和其他应用程序相关,那么我希望它在 gem 中。通常,/lib 中剩下的代码非常简单,或者还没有被制作成 gem。例如,如果我仍在确定代码的结构,我发现从/lib 执行此操作比使用 gem 更容易。我避免从/lib 引用/app 中的项目。

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

    我将后台作业的代码放在app/jobs 中。我还没有与 Twitter 和 Facebook,但我怀疑有一些宝石可以处理大部分连接和数据检索。作业代码将使用这些 gem 检索数据,转换代码,然后更新 ActiveRecord 模型。

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


    我确信/lib/twitter_apilib/facebook_api 也可以。尽管我避免/lib,但我确实喜欢您将这些项目限制在它们自己的目录中,以便它们在这方面具有凝聚力。

    【讨论】:

    • 这是一个很好的答案。谢谢!我正在使用 resque 进行实际提取,因此用户的响应时间不会很差。我的问题一直是决定这些服务是否真的是我的应用程序的一等公民,我已经确定它们是,所以我认为我正在将它们移出 lib。
    猜你喜欢
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 2017-06-20
    • 1970-01-01
    相关资源
    最近更新 更多