[英]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.