生产环境中的Rails变量

时间:2019-04-17 07:26:10

标签: ruby-on-rails ruby

我正在开发Rails应用程序。大多数部分都能正常工作,但是当我尝试计算用户用于编辑和提交一份表格的时间时,我遇到了一个奇怪的问题。

我认为最好按以下顺序进行: 1.在控制器的“编辑”方法中,记录用户开始查看表单的时间。 2.在“更新”方法中,记录提交时间,然后进行数学计算并获取用户在表单上花费的时间。

class Test
  @@start_time = 0
  @@end_time = 0

  def edit
    @@start_time = Time.now
  end

  def update
    @@end_time = Time.now
    time_used = @@end_time - @@start_time
    puts time_used.to_i
  end
end

上面的代码在我自己的开发计算机上运行时实际上可以正常工作,输出是我所期望的。但是,当我将代码上传到生产环境(多核cpus)时,有时输出正确,有时不正确。我调试了代码,发现在某些情况下,提交表单时@@ start_time设置为0。我很困惑发生了什么,也许我只是误用了@@作为变量。请帮帮我,任何想法将不胜感激,谢谢。

编辑: 如Vishal所述,通过向模型添加虚拟属性来解决该问题。另外,我在提交表单中添加了一个隐藏字段,在强参数部分中添加了相应的参数,以允许其从编辑传递到更新方法。

2 个答案:

答案 0 :(得分:1)

当两个以上的用户尝试同时编辑时,您的解决方案将产生冲突,所以基本上我的想法是:

  1. 在模型edit_start_time中添加一个虚拟属性endtime不需要属性,因为Time.now可以随时直接获取它。

  2. edit_start_time方法中设置edit值,例如:

      @model.edit_start_time = Time.now.utc #you can use any  
    
  3. update方法中直接计算编辑时间,例如:

    total_update_time = Time.now.utc - @model.edit_start_time.utc
    

如果您不知道如何创建虚拟属性,那么StackOverflow和文档中都会有很多问题。在这里我不解释如何做,因为它是不同的主题。

祝一切顺利

答案 1 :(得分:0)

您正在使用可以互相干扰的类变量。您的Test类将永远只有一个与之关联的类变量@@start_time

这意味着如果其他用户看到该表单,他们将为当前在该表单上的每个用户重置@@ start_time。

为防止这种情况,请使用实例变量。当新用户看到表单时,他们将创建一个新的实例变量,该变量绑定到他们的类实例,而不是类本身。这样用户可以有不同的开始时间和结束时间。0

您需要做的就是将每个@@更改为@。因此,在整个代码中,请不要使用@@start_time', try @ start_time`,在end_time中也应如此。