Ruby on Rails中的Web请求中存在哪些数据(如果有)?
我决定在创建视图助手类时使用单例设计模式。 这让我思考; 单例实例是否会在请求中存活? 这导致了另一个问题, 哪些变量(如果有的话)在Web请求中存在并且是否会根据部署而发生变化? (Fastcgi,Mongrel,Passenger,……)
我知道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
我正在做的是在路线中接收请求,向Zapier发送GET,并在另一条路线中等待答案。 Rails为每个请求打开一个新的Thread,所以我在RAM中写入我的数据格式为’key:value’
Rails.cache在不同的线程中没有缓存?
网络是无国籍媒体。 除非您故意在会话中保存数据或在get或post中传递数据,否则每个Web请求都以空白列表开头。 一旦将页面传递到Web浏览器,就会销毁使用当前请求创建的任何对象。