【问题标题】:@@classVariable in ruby on rails turns uninitialized on nginx - ec2ruby on rails 中的@@classVariable 在 nginx 上未初始化 - ec2
【发布时间】:2015-03-16 12:53:04
【问题描述】:

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

def 测试控制器 @@classVariable = ""

定义索引
@@classVariable = "怎么了兄弟"
日志(@@classVariable)
结束

def callThisMethodViaAJAXFromJavascript
log("到达这个方法")
日志(@@classVariable)
结束

def 日志(str)
File.write("aValidPath", str)
结束

结束

这是我要做的:当我在测试/索引上加载页面时,索引方法会执行,并将 @@classVariable 正确记录为:
“怎么了兄弟”

但是当我从前端通过 AJAX 调用方法 callThisMethodViaAJAXFromJavascript 时,我的日志文件如下所示:
“达到这个方法”
""

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

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

【问题讨论】:

    标签: ruby-on-rails nginx amazon-ec2 webrick class-variables


    【解决方案1】:

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

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

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

    【讨论】:

    • 这很有趣——我没想到。您认为处理这种情况的最佳方法是让 AJAX 调用使用相同的 rails 实例?谢谢。
    • @hackstar15 最好的办法就是完全不依赖这个
    【解决方案2】:

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

    根据经验,如果您的变量正在发生变化,您似乎不应该在 Rails 中使用全局变量或类变量。

    存储在会话对象中的值与 rails 中的任何进程相同。尽管指向会话的指针可能不同,但值将保持不变。这是另一篇关于会话的帖子,其中更详细: How is rails session shared among unicorn workers?

    【讨论】:

      猜你喜欢
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多