Ruby on Rails 控制器中的@@variables 是特定于用户会话的,还是所有用户都会看到相同的值?

Hor*_*ice 6 ruby ruby-on-rails ruby-on-rails-3.2

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

rav*_*ode 6

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

进程之间不共享类变量,因此您会得到不一致的结果

有关更多信息,请查看:

  1. O'Reilly Ruby - 不要使用类变量!
  2. 为什么要避免在 rails 中使用类变量 @@?

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

class Computation
  attr_reader :computed_data
  @computed_data = 3
end
Run Code Online (Sandbox Code Playgroud)

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

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

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


Ton*_*son 4

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