在Rails应用程序中放置完全杂项代码的位置

时间:2012-08-20 03:01:06

标签: ruby-on-rails ruby-on-rails-3

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

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

我不确定在哪里放置所有这些无关的回调方法。它们是多种多样的,并且涉及到许多不同的模型,我不确定将它们放在QueuedRequest模型下是否正确(尽管这似乎最简单,特别是在测试方面)。我想将它们整合在一个地方(再次使测试变得更容易),所以试图将它们变成相关的模型(尽管它们通常可能与模型无关)并不起作用。

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

详细信息: Rails 3.2.6


更新:为了详细说明下面的答案,我最终做的是在/ lib / api中放置一个实用程序方法模块。我将/ lib / api添加到/config/application.rb中的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'

3 个答案:

答案 0 :(得分:4)

lib目录下,不要忘记将其添加到自动加载路径(如果你的应用是线程安全的话,还是eagerload路径!)。创建一个名为api的文件夹,然后将其粘贴在命名空间

例如,lib/api/stack_overflow.rb

module API
   class StackOverflow
     # schtuff
   end
end

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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