@@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?
我有一个初始化的 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?