首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Rails.cache.fetch不适用于json数组。

Rails.cache.fetch不适用于json数组。
EN

Stack Overflow用户
提问于 2018-01-12 22:46:59
回答 2查看 1.9K关注 0票数 0

我试图使用Rail.cache.fetch特性来缓存服务器API响应,但似乎总是‘零’而不是缓存数据。方法运行一次,然后在尝试通过@my_api_data_变量时出现“访问nil类”类错误时总是失败。

代码语言:javascript
代码运行次数:0
运行
复制
def index
  api_statuses_

end
def api_statuses_
  Rails.cache.fetch('api_repsonse_m_', expires_in: 3.minute) do


      @mypairs_ = ['ticker1','ticker2', 'ticker3', 'ticker4', 'ticker5', 'ticker6', 'ticker7', 'ticker8', 'ticker9', 'ticker10']

      @my_api_data_ = []
      @my_api_data_poplr = []
      url = 'https://myserver.com/ticker/'

      @mypairs_.each do |item_|
        uri = URI(url + item_)
        response = Net::HTTP.get(uri)
        begin
          #response is like this {"status":"valu1","time":"valu2","data":"valu3"}
          myresult = JSON.parse(response)
        rescue JSON::ParserError

        end
        #Rails.logger.info myresult
        @my_api_data_.push(myresult);
      end

  end
end

我希望也许有人知道为什么每次都会变坏

我试着在缓存块结束之前添加行"@my_api_data_“。这也是我在最初的情况下所犯的错误:

代码语言:javascript
代码运行次数:0
运行
复制
I, [2018-01-13T19:29:14.384766 #5716]  INFO -- : Processing by Private::MydataController#index as HTML
I, [2018-01-13T19:29:14.403774 #5716]  INFO -- :   Rendered private/mydata/index.html.slim within layouts/mydatalayout_ (0.7ms)
I, [2018-01-13T19:29:14.403919 #5716]  INFO -- : Completed 500 Internal Server Error in 19ms
F, [2018-01-13T19:29:14.405077 #5716] FATAL -- : 
ActionView::Template::Error (undefined method `each' for nil:NilClass):
    37:         .row
    38:           /! Top head coin-boxes
    39:           .market-top-coin-boxes
    40:             - @my_api_data_.each do |pair_data|
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-13 09:28:45

这里的问题似乎是,您必须在块的末尾返回@my_api_data_。让我们检查下面的代码:

代码语言:javascript
代码运行次数:0
运行
复制
def api_statuses_
  Rails.cache.fetch('api_repsonse_m_', expires_in: 3.minute) do
    @mypairs_ = ['ticker1','ticker2', 'ticker3', 'ticker4', 'ticker5', 'ticker6', 'ticker7', 'ticker8', 'ticker9', 'ticker10']

    @my_api_data_ = []
    @my_api_data_poplr = []
    url = 'https://myserver.com/ticker/'

    @mypairs_.each do |item_|
      uri = URI(url + item_)
      response = Net::HTTP.get(uri)
      begin
        #response is like this {"status":"valu1","time":"valu2","data":"valu3"}
        myresult = JSON.parse(response)
      rescue JSON::ParserError
      end
      #Rails.logger.info myresult
      @my_api_data_.push(myresult);
    end
    @my_api_data
  end
end

请注意,第一次调用api_statuses_方法时,将执行所有阻塞的值,返回值将写入api_repsonse_m_键下的缓存。因此,下次调用api_statuses_时,如果expires_in中的时间尚未过期,它将返回缓存中保存的值,并且不会执行该块。

另外,你能告诉我们你在哪里和如何使用这种方法吗?显示代码和错误日志可以很好地理解问题。

更新的:您似乎没有正确地使用这个。应该在api_statuses_控制器下的索引方法中调用MydataController方法,并将返回值保存到将在视图中使用的变量中。

例如:

代码语言:javascript
代码运行次数:0
运行
复制
module Private
  class MydataController
    def index 
      @api_statuses = api_statuses_
    end
  end
end

然后,在你看来:

代码语言:javascript
代码运行次数:0
运行
复制
.row
  .market-top-coin-boxes
    - @api_statuses.each do |pair_data|
票数 1
EN

Stack Overflow用户

发布于 2018-01-14 04:25:44

你为什么在视图中使用“@my_api_data_”?

使用

代码语言:javascript
代码运行次数:0
运行
复制
def index
  @result = api_statuses_
end

在视图文件中使用@result。注意,如果有缓存命中,则不会运行传递给Rails.cache.fetch的块。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48235064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档