Rails.cache.fetch con expires_in solo caducará si el nuevo valor no es nulo

Quiero hacer un Rails.cache.fetch simple y Rails.cache.fetch después de unos 10 minutos. El caché se llena con datos json de una API externa. Sin embargo, la API externa no es accesible a veces. Por lo tanto, cuando la memoria caché caduca e intenta obtener nuevos datos json, el contenido de la memoria caché se vuelve inválido.

¿Cómo puedo hacer que Rails.cache.fetch SÓLO EXPIRE el caché si fetch_json devuelve datos válidos? Sin embargo, la memoria caché debe caducar después de 10 minutos si recibe nuevos datos válidos.

Así es como traté de hacerlo, pero no funciona. Mejor resaltado de código en esta Gist: https://gist.github.com/i42n/6094528

¿Algún consejo de cómo puedo conseguir este trabajo?

 module ExternalApiHelper require 'timeout' require 'net/http' def self.fetch_json(url) begin result = Timeout::timeout(2) do # 2 seconds # operation that may cause a timeout uri = URI.parse(url) http = Net::HTTP.new(uri.host, uri.port) request = Net::HTTP::Get.new(uri.request_uri) response = http.request(request) return JSON.parse(response.body) end return result rescue # if any error happens in the block above, return empty string # this will result in fetch_json_with_cache using the last value in cache # as long as no new data arrives return "" end end def self.fetch_json_with_cache(url, expire_time) cache_backup = Rails.cache.read(url) api_data = Rails.cache.fetch(url, :expires_in => expire_time) do new_data = fetch_json(url) if new_data.blank? # if API fetch did not return valid data, return the old cache state cache_backup else new_data end end return api_data end end 

Resuelto de esta manera. Tal vez no sea la forma más elegante de hacerlo, pero funciona: https://github.com/ReliveRadio/reliveradio-website/blob/4874cf4158361693e65643d9e7f11333d9d6/app/helpers/external_api_helper.rb