【问题标题】:Cache an http call results in rails在 Rails 中缓存 http 调用结果
【发布时间】:2017-11-27 19:41:39
【问题描述】:

我是 Rails 新手,遇到了这个问题。

我想做的是: 我需要调用服务 A 来检索 idA,然后使用 idA 执行其他操作。我在控制器中的操作类似于

class SomeController < ApplicationController
  def someAction
    idA = getIdAfromServiceA(config)
    doSomethingElseToServiceB(idA)
  end
end

由于 serviceA 的结果只依赖于 config,一旦 config 被加载,idA 应该不会改变。因此我想缓存 idA。

我尝试使用实例变量来缓存它,没有运气(“getIdAfromServiceA is called is called is printed”)

class SomeController
  def getIdAfromServiceA(config)
    @IdA ||= getIdAfromServiceAviaHTTP(config)
  end

  private
  def getIdAfromServiceAviaHTTP(config)
     puts "getIdAfromServiceAviaHTTP is called"
     #make some http call
  end
end

我还尝试将其放入application.rb 以在启动时对其进行缓存。它显示错误:undefined method 'getIdAfromServiceAviaHTTP' for SomeHelper:Module (NoMethodError)

module MyProject
  class Application < Rails::Application
    config.load_defaults 5.1
    require_relative 'relativePathToSomeHelperModule'
    config.idA  = SomeHelper.getIdAfromServiceAviaHTTP(config)
  end
end

所以我的问题是,实现这一目标的好方法是什么?我已经在谷歌上搜索了一段时间,但最终是徒劳的。你能帮我吗?谢谢!

【问题讨论】:

  • 这个IdA 在整个申请过程中不会改变吗?
  • 是的。只有当用户更新配置时它才会改变,这需要重新启动应用程序。因此它可以在应用程序的生命周期内被视为常量
  • 那么这个idA本质上是配置的一部分,据我了解,应该这样对待
  • JFYK,ruby 中的方法命名和局部变量应该是snake_case。您可以查看其他 ruby​​ 样式指南here
  • @AtulKhanduri 谢谢!

标签: ruby-on-rails ruby caching


【解决方案1】:

/config/initializers/ 下创建一个 ruby​​ 文件并将该代码放在那里。

选项 1:

# config/initializers/ida_from_api.rb

IDA = SomeHelper.getIdAfromServiceAviaHTTP(config)

然后您可以在整个应用程序中使用IDA

选项 2:

# config/initializers/ida_from_api.rb

Rails.configuration.idA = SomeHelper.getIdAfromServiceA(config)

然后您可以在整个应用程序中使用Rails.configuration.idA。更多详情请查看Custom configuration

仅供参考 - initializers 下的文件在应用程序启动时加载。

【讨论】:

  • 快点打败我吧!您还可以添加Rails.configuration.idA = SomeHelper.getIdAfromServiceA(config),然后可以通过Rails.configuration.idA 在应用范围内访问。
  • 谢谢@ChrisHeald!你会把这行代码放在哪里?
  • @David 编辑了我的答案以添加 ChrisHeald 的选项。
猜你喜欢
  • 2015-05-08
  • 1970-01-01
  • 2017-05-10
  • 1970-01-01
  • 2017-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多