J'utilise Rails 5. Je veux utiliser le cache de stockage en mémoire Rails pour mettre les données en mémoire cache, mais je ne voudrais pas mettre ces données en cache si la valeur des données est nulle. Comment puis-je faire cela? Je thoguth Je coudl cache Rails et étends écrire ma propre méthode, donc j'ai trouvé le code ci-dessousComment puis-je dire à Rails inmemory cache de ne pas créer d'entrée si la valeur est nulle?
module ActiveSupport
module Cache
class Store
def fetch_no_nil(name, options = nil)
if block_given?
options = merged_options(options)
key = namespaced_key(name, options)
cached_entry = find_cached_entry(key, name, options) unless options[:force]
entry = handle_expired_entry(cached_entry, key, options)
if entry
get_entry_value(entry, name, options)
else
save_block_result_to_cache_if_not_nil(name, options) { |_name| yield _name }
end
else
read(name, options)
end
end
private
def save_block_result_to_cache_if_not_nil(name, options)
result = instrument(:generate, name, options) do |payload|
yield(name)
end
write(name, result, options) unless result.nil?
result
end
end
end
end
cependant, cela ne semble pas travailler sur Raisl 5. Je reçois l'erreur ci-dessous lorsque j'invoque la « fetch_no_nil "méthode ...
Please use `normalize_key` which will return a fully resolved key.
(called from fetch_no_nil at /Users/davea/Documents/workspace/myproject/config/initializers/enhanced_cache.rb:7)
NoMethodError: undefined method `find_cached_entry' for #<ActiveSupport::Cache::MemoryStore:0x007fa6b92ae088>
from /Users/davea/Documents/workspace/myproject/config/initializers/enhanced_cache.rb:9:in `fetch_no_nil'
from /Users/davea/Documents/workspace/myproject/app/helpers/webpage_helper.rb:116:in `get_cached_content'
from /Users/davea/Documents/workspace/myproject/app/helpers/webpage_helper.rb:73:in `get_url'
from (irb):1
from /Users/davea/.rvm/gems/ruby-2.4.0/gems/railties-5.0.2/lib/rails/commands/console.rb:65:in `start'
from /Users/davea/.rvm/gems/ruby-2.4.0/gems/railties-5.0.2/lib/rails/commands/console_helper.rb:9:in `start'
from /Users/davea/.rvm/gems/ruby-2.4.0/gems/railties-5.0.2/lib/rails/commands/commands_tasks.rb:78:in `console'
from /Users/davea/.rvm/gems/ruby-2.4.0/gems/railties-5.0.2/lib/rails/commands/commands_tasks.rb:49:in `run_command!'
from /Users/davea/.rvm/gems/ruby-2.4.0/gems/railties-5.0.2/lib/rails/commands.rb:18:in `<top (required)>'
from bin/rails:4:in `require'
from bin/rails:4:in `<main>'
y at-il une autre façon, je peux demander à mon cache Rails de ne pas créer une entrée si la valeur est nulle?