簡體   English   中英

Rails.cache.fetch不適用於json數組

[英]Rails.cache.fetch does not work for array of json

我正在嘗試使用Rail.cache.fetch功能來緩存服務器API響應,但似乎總是“ nil”而不是緩存的數據。 下面的方法運行一次,然后在嘗試通過@my_api_data_變量時總是失敗,並顯示“訪問nil類”類錯誤

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_」行。 這是我在原始情況下遇到的相同錯誤:

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|

看來這里的問題是您必須在塊末尾返回@my_api_data_ 讓我們檢查下面的代碼:

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的時間尚未到期,它將返回保存在緩存中的值,並且該塊將不會執行。

另外,您能告訴我們您在哪里以及如何使用這種方法嗎? 顯示代碼和錯誤日志可能對理解問題很有幫助。

已更新 :看來您沒有正確使用此功能。 您應該在MydataController控制器下的index方法中調用api_statuses_方法,並將返回值保存到將在視圖中使用的變量。

例如:

module Private
  class MydataController
    def index 
      @api_statuses = api_statuses_
    end
  end
end

然后,在您看來:

.row
  .market-top-coin-boxes
    - @api_statuses.each do |pair_data|

為什么在視圖中使用“ @my_api_data_”?

采用

def index
  @result = api_statuses_
end

在視圖文件中使用@result。 注意,如果有緩存命中,則傳遞給Rails.cache.fetch的塊不會運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM