Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails使用ActiveSupport::Cache::MemoryStore在两个api调用(控制器方法)之间保存变量_Ruby On Rails_Ruby_Memcached - Fatal编程技术网

Ruby on rails Rails使用ActiveSupport::Cache::MemoryStore在两个api调用(控制器方法)之间保存变量

Ruby on rails Rails使用ActiveSupport::Cache::MemoryStore在两个api调用(控制器方法)之间保存变量,ruby-on-rails,ruby,memcached,Ruby On Rails,Ruby,Memcached,我有一些API,我想保存一些可以在每个API方法之间访问的值,所以我尝试使用ActiveSupport::Cache::MemoryStore。我可能没有正确使用MemoryStore(从未使用过它,找不到它的特定教程) 我是否正确使用MemoryStore?看起来它应该非常简单,但似乎不能保存任何价值 class MyController # 1st API handler /post def first @cache = ActiveSupport::Cache::Memor

我有一些API,我想保存一些可以在每个API方法之间访问的值,所以我尝试使用ActiveSupport::Cache::MemoryStore。我可能没有正确使用MemoryStore(从未使用过它,找不到它的特定教程)

我是否正确使用MemoryStore?看起来它应该非常简单,但似乎不能保存任何价值

class MyController
  # 1st API handler /post
  def first
    @cache = ActiveSupport::Cache::MemoryStore.new() if @cache.nil?
    @cache.write('shared_val', params['user_key'])
  end

  # 2nd API handler /post
  def second
    @cache = ActiveSupport::Cache::MemoryStore.new() if @cache.nil?
    saved_val = @cache.read('shared_val')
    puts "#{saved_val}"  # nil?????
  end
我还尝试了一些我在SO答案中看到的例子,但似乎仍然无法保存价值

  # In config file
  config.cache_store = :memory_store

  # 1st API handler /post
  def first
    Rails.cache.write("ABC", "abc")
    check_val = Rails.cache.read('ABC')
    puts "VALUE: #{check_val}"  # shows correct 'abc'
  end

  # 2nd API handler /post
  def second
    Rails.cache.fetch("ABC")  # gets nil, why???
    Rails.cache.read("ABC)    # also nil
  end

默认情况下,
config.action\u controller.perform\u caching
为false。您需要在其他环境中启用它

您使用的是什么web服务器?内存存储区仅在单个进程内共享数据。根据文档,如果您在集群模式下使用Puma、Phusion Passenger或任何其他多进程或多服务器web服务器,则您的第二个请求可能无法访问相同的缓存。另外,
fetch
是一种用于读取或写入的缓存方法。它使用您作为arg传递的密钥进行读取,如果读取失败,它将使用一个块写回缓存。它是用于延迟缓存的。您可能需要使用redis或memcached存储。你的第二个例子看起来更像我期望的工作。顺便说一句,这就是我在文档中读到的。Nate,我只是在开发环境中使用puma运行它。puma web_并发设置已被注释,我还尝试将最大线程数设置为1。当调用第二个API时仍然得到nil。如果设置
config.action\u controller.perform\u caching=true
,该怎么办?是!!!!!!!!,抱歉,我懒得检查整个development.rb文件,else块正在禁用我的设置。谢谢你能把你的答案贴出来吗?我会接受的。我很肯定这可能会对以后的人有所帮助,因为我已经在谷歌上搜索过很多次了。