什么数据能在Ruby on Rails的Web请求中持续存在?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (28)

我知道Controller实例变量不会被持久化。我知道常量是持久的(或重新加载?)。但我不知道类变量,类的实例变量,Eigenclasses的区别

提问于
用户回答回答于

简单的答案是没有。每个请求都被视为一个独立事件,除了存储在用户会话和任何外部数据库,缓存或文件存储中的内容之外,不会传输任何状态信息。最好是在设计你的应用程序时考虑到这一点,不要因为你设置了它们而期望事物持续存在。

更复杂的故事是有些事情会持续下去。例如,可以在控制器上创建一个类变量,并且可以像期望的那样从一个请求转到另一个请求。问题在于,这只适用于包含在该进程中的该控制器的单一实例,并不适用于其他进程提供的请求。如果需要缓存,请使用Rails.cache基础架构,并避免自己的黑客入侵。

一个典型的生产环境是一个复杂的,不断变化的过程,过程不断创建和销毁,并且无法事先确定哪个过程最终会最终服务于特定请求。由于许多部署不仅涉及单台机器上的多个进程,还涉及多台机器,因此实际上没有实际的方法来创建应用程序范围的单例对象。

可以做的最好的事情是在缓存引擎之上构建一个图层,其中的单例对象仅仅是从缓存中获取和写入的函数的包装。这样可以在保持进程间一致性的同时提供单例对象的外观。

用户回答回答于

我知道这篇文章已经过时,但是对于谁在寻找解决方案,可以使用Rails.Cache,如下所示:

class TestEventsController < ApplicationController
  require 'httparty'

  @@cache = ActiveSupport::Cache::MemoryStore.new(expires_in: 5.minutes)

  before_action :get_data, only: [:get]
  before_action :get_response, only: [:set]

  def get
    uri = "https://hooks.zapier.com/hooks/catch/zap_id/"
    event_id = event_id_generate()
    @@cache.write(event_id, "")

    result = HTTParty.post(uri.to_str,
    :body => {id: event_id, data: @data}.to_json,
    :headers => {'content-Type' => 'application/json'})
    sleep 2
    render json: { 'value': @@cache.read(event_id) }, status: 200
  end

  def set
    @@cache.write(@id, @value)
    render json: { 'value': @@cache.read(@id) }, status: 200
  end

  def get_data
    @data = params["data"]
  end
  def get_response
    @id = params["id"]
    @value = params["value"]
  end

  def event_id_generate
    token = SecureRandom.urlsafe_base64(10, false)
  end
end

我正在做的是在路线上收到一个请求,发送GET到Zapier,并在另一条路线上等待答案。Rails为每个请求打开一个新的线程,所以我在RAM中写入数据格式为'key:value'

扫码关注云+社区