1

我有一个可与多个 3rd 方 API 配合使用的 rails 应用程序。其中一些 API 受到速率限制,许多 API 的方法可能需要数小时才能完成,您必须不断检查您的请求是否已准备好。因此,我建立了一个排队系统来管理所有的行李。

进入此队列的每个请求都有一个 JSON 字符串,其中详细说明了请求所属的第 3 方 API、哪种方法、哪些参数以及处理响应的回调。我将需要很多回调方法,它们处理截然不同的任务。一些更新第 3 方的服务状态,一些更新客户信息,一些创建另一个排队请求以下载大型 CSV 或解析 CSV,等等。

我不确定将所有这些不相关的回调方法放在哪里。它们种类繁多,并且涉及许多不同的模型,以至于我不确定将它们置于 QueuedRequest 模型下是否正确(尽管这似乎是最简单的,尤其是在测试方面)。我想将它们合并在一个地方(再次使测试更容易),因此试图将它们硬塞到相关模型中(尽管它们通常可能根本与模型无关)是行不通的。

各种实用程序类似乎是最好的地方,但我会把那个文件放在哪里?

详细信息: Rails 3.2.6


更新:为了详细说明下面的答案,我最终做的是在 /lib/api.xml 中放置一个实用方法模块。我在 /config/application.rb 中将 /lib/api 添加到我的 autoload_paths 中,并且未提及,我创建了一个初始化程序来为我将模块加载到我的应用程序中。

/lib/api/callbacks.rb

module Callbacks
  extend self
  def some_method
    # magic
  end
end

/config/application.rb

config.autoload_paths += %W(#{config.root}/lib/api)

/config/initializers/application.rb

require 'callbacks'
4

3 回答 3

4

在该lib目录下,不要忘记将它添加到您的自动加载路径(如果您的应用程序是线程安全的,则添加到 eagerload 路径!)。创建一个名为的文件夹api,然后将这些内容粘贴到命名空间中

例如,lib/api/stack_overflow.rb

module API
   class StackOverflow
     # schtuff
   end
end
于 2012-08-20T04:05:11.143 回答
1

你总是可以把它扔到 lib 文件夹中。

于 2012-08-20T03:50:39.063 回答
1

我正在开发一个查询外部 API 并将数据呈现给用户而不实际将其保存到数据库的应用程序。这个过程涉及到各种元素(将 API 密钥和用户 ID 传递给 API,验证请求中的查询参数,解析响应等)与实际的 rails 应用程序没有太大关系(这将主要集中在向用户呈现这些数据),所以我将所有 API 内容拆分到lib.

通过这种方式,我可以将其与主应用程序分开测试,从而实现关注点的清晰分离。此外,由于我的库类不是基于 activemodel,因此可以将库分离到自己的 gem 中,并可能用于其他非 Rails 项目。例如,我考虑过为 sinatra 切换轨道,考虑到当前的设置,这很容易做到。

于 2012-08-20T03:55:21.153 回答