Rails.cache.fetch 不适用于 json 的数组
Rails.cache.fetch does not work for array of json
我正在尝试使用 Rail.cache.fetch 功能缓存服务器 API 响应,但似乎总是 'nil' 而不是缓存数据。下面的方法运行一次,然后在我尝试通过 @my_api_data_ 变量
时总是失败并出现 'access to nil class' 类错误
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|
看来这里的问题是你必须在块的末尾return @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_
方法时,所有被阻塞的都会被执行,return值会被写入到api_repsonse_m_
键下的缓存中。所以,下次你调用api_statuses_
,如果expires_in
中的时间还没有过期,它会return将值保存在缓存中,块不会被执行。
另外,你能告诉我们你在哪里以及如何使用这种方法吗?显示代码和错误日志可能有助于理解问题。
已更新:看来你没有正确使用这个。您应该在 MydataController
控制器下的索引方法中调用 api_statuses_
方法,并将 return 值保存到将在您的视图中使用的变量。
例如:
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 的块不是 运行.
我正在尝试使用 Rail.cache.fetch 功能缓存服务器 API 响应,但似乎总是 'nil' 而不是缓存数据。下面的方法运行一次,然后在我尝试通过 @my_api_data_ 变量
时总是失败并出现 'access to nil class' 类错误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|
看来这里的问题是你必须在块的末尾return @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_
方法时,所有被阻塞的都会被执行,return值会被写入到api_repsonse_m_
键下的缓存中。所以,下次你调用api_statuses_
,如果expires_in
中的时间还没有过期,它会return将值保存在缓存中,块不会被执行。
另外,你能告诉我们你在哪里以及如何使用这种方法吗?显示代码和错误日志可能有助于理解问题。
已更新:看来你没有正确使用这个。您应该在 MydataController
控制器下的索引方法中调用 api_statuses_
方法,并将 return 值保存到将在您的视图中使用的变量。
例如:
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 的块不是 运行.