【问题标题】:Are @@variables in a Ruby on Rails controller specific to the users session, or are all users going to see the same value?Ruby on Rails 控制器中的@@variables 是特定于用户会话的,还是所有用户都会看到相同的值?
【发布时间】:2014-03-04 23:07:31
【问题描述】:

我有一个控制器,其中有一个“无视图”操作。该控制器用于设置一个名为@@ComputedData={} 的变量。但是数据是根据应用程序用户上传的 csv 文件计算的。现在用户会看到他们的特定数据还是@@ComputeData 对所有用户都一样?有人可以解释一下这个概念吗?我真的对此感到不安。提前感谢您,并对菜鸟问题感到抱歉。

【问题讨论】:

  • 您确定要为此使用@@ 类变量吗?

标签: ruby-on-rails ruby ruby-on-rails-3.2


【解决方案1】:

在 Rails 中使用类变量时要小心。

类变量在进程之间不共享,所以你会得到不一致的结果

欲了解更多信息,请查看:

  1. O'Reilly Ruby - Don't Use Class Variables!
  2. Why should we avoid using class variables @@ in rails?

您始终可以使用类和类方法为所有用户提供相同的数据:

class Computation
  attr_reader :computed_data
  @computed_data = 3
end

所以你可以要求Computation.computed_data(将是3),

但是Computation.computed_data = 4 会给你一个NoMethodError

如果你在另一边,如果你想要computed_data每个用户,你应该把它保存在一个 ActiveRecord 模型的数据库中(Rails 的典型案例)......

【讨论】:

  • 我只想将计算的数据存储在与用户关联的数据库中。因此,如果我选择使用常规的 ruby​​ 类,每个控制器请求都会有自己的 ruby​​ 类实例吗?我的 ruby​​ 类将通过用户上传的文件。然后该类将解析数据并返回计算结果。这是更安全的方法吗?
  • TazMan 你应该从 Rails Guides - Getting Started 开始,并使用 Posts 的示例了解 ActiveRecord 和控制器的工作原理。然后调查Carrierwave gem上传文件。
  • 请回复上面的评论。我要问的问题甚至没有得到解决。我正在尝试学习控制器的工作原理!每个控制器实例是否都有该常规 ruby​​ 类的唯一实例??
  • TazMan,我的评论确实回答了你的问题。 Rails 是一个 MVC 框架,其中每个组件(控制器、模型、视图)都有其职责,并且您正在尝试解决您的问题,就像它不是 MVC 一样。您不能/不应该在控制器上拥有特定的用户数据。
  • TazMan 无论如何,最好编辑问题,更好的是,创建一个更符合您需求的新问题。
【解决方案2】:

@@ComputedData 是一个类变量。所有用户都将看到相同的数据,所以这个主意。

【讨论】:

    【解决方案3】:

    不要将class variables (@@)global variables ($) 混淆。 在this post你会看到解释和他们之间的区别。

    【讨论】:

    • 我不明白你为什么提出全局 $ 变量。我认为这不适用于我的情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    相关资源
    最近更新 更多