我正在开发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所述,通过向模型添加虚拟属性来解决该问题。另外,我在提交表单中添加了一个隐藏字段,在强参数部分中添加了相应的参数,以允许其从编辑传递到更新方法。
答案 0 :(得分:1)
当两个以上的用户尝试同时编辑时,您的解决方案将产生冲突,所以基本上我的想法是:
在模型edit_start_time
中添加一个虚拟属性endtime
不需要属性,因为Time.now
可以随时直接获取它。
在edit_start_time
方法中设置edit
值,例如:
@model.edit_start_time = Time.now.utc #you can use any
在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中也应如此。