@@classVariable in ruby on rails 在 nginx - ec2 上变为未初始化

@@classVariable in ruby on rails turns uninitialized on nginx - ec2

我有一个初始化的 class 变量,后来神奇地自行未初始化...在 rails 默认服务器 (WEBrick) 上进行本地开发时,没有问题。这只发生在 ec2 上的 nginx 上。这是一些代码..

def TestController < ApplicationController
  @@classVariable = ""

  def index
    @@classVariable = "What's up homie"
    log(@@classVariable)
  end

  def callThisMethodViaAJAXFromJavascript
    log("reached this method")
    log(@@classVariable)
  end

  def log(str)
    File.write("aValidPath", str)
  end

end

我是这样做的:当我在 test/index 上加载页面时,索引方法会执行,并将 @@class 变量正确记录为:
"What's up homie"

但是当我从前端通过 AJAX 调用方法 callThisMethodViaAJAXFromJavascript 时,我的日志文件如下所示:
"reached this method"
""

同样,这只发生在 ec2 上的 nginx 上(OS 是 ubuntu)。当我在 WEBrick 本地 运行 时,这永远不会发生。

有什么想法吗?非常感谢。

您没有说明您是如何使用 nginx(作为某些独角兽实例的反向代理,以及 passenger 等),但无论哪种方式,您通常都会有多个应用程序实例。每个都是一个单独的进程,因此在一个进程中设置 class 变量对另一个进程没有影响。

Nginx 将平衡 rails 个实例之间的请求 - 因此索引页面由一个实例提供,而 ajax 操作将经常由 clas 变量仍为空的另一个进程提供服务字符串.

在使用 webrick 进行开发时,只有一个 rails 实例,因此您不会遇到此问题。我不确定您要做什么,但是 class 变量不是跨请求保存状态的好方法

根据@Frederick 的回答,我使用 rails session 来存储变量。

根据经验,如果您的变量正在更改,您似乎不应该在 rails 中使用全局变量或 class 变量。

session object 中存储的值与 rails 中的任何进程相同。尽管指向 session 的指针可能不同,但值将保持不变。这是关于 session 的另一个 post,更详细: How is rails session shared among unicorn workers?