2014-04-12 31 views
1

找遍了互联网,但无法找到任何答案,我的问题..修改表单字段之前它得到PARAMS(轨道4)

我有形式,即用户可以输入的时间在下面的格式 - HH:MM:SS或MM:SS或秒。让我们称这个模型为LapResult,场名为lap_time。 我需要对这些数据进行计算,所以我需要以秒为单位保持它在数据库中的整数。例如计算所有圈数的总时间,或计算两个竞争者之间的差异。

我已经试过两种解决方案:在DB

1)lap_time列是整数。但是经过一段时间的模型,由于数据类型是整数,输入自动转换。例如,如果我输入11:56 - 它将在模型实例中为11。
params[:lap_result][:lap_time] = 11:56 lap_result = LapResult.new(lap_result_params)

现在,如果我叫before_save before_validation或其它回调,我将与11号操作,因为race_result.lap_time现在是11.我想它会自动被改变,因为列的数据类型是整数。

2)我也试图在传递到新的LapResult模型之前更改params(或者params的复制变量)。此方法适用于我正在查找的内容 - 时间已成功转换为整数,但后来遇到另一个问题。
如果用户输入由于某种原因未通过验证,当页面重新加载时,参数不会传输到表单,并且用户必须再次输入所有数据。这是问题,因为有时可以有多达20圈的比赛..

目前,我通过更改数据类型为字符串来解决此问题,但我觉得这样做是不好的做法,因为DB中的数据应该始终是一个整数类型。并且因为在其他模型中相同的数据在DB中具有整数类型。对于惯例而言,配置原则并不是一个好主意。

来自rails guru的任何建议? 在此先感谢。

-
奖金的问题!如果表单未通过验证并且页面会重新载入所有数据,那么肯定会在几秒钟内显示。任何方式再次将其转换为MM:SS格式。我想用javascript做这种工作更容易。有任何想法吗?
ps:使用total_laps.times {lap_results.build}创建的多个表单,因为它是嵌套模型的形式,所以我无法找到从params手动设置值的方法。

+0

_2)还我试图改变PARAMS(或则params的复制变量)..._你通过做params哈希表的深层副本'克隆'之前修改它们?如果你保持完整的参数,表格应该把它们拿起来。 –

+0

不知道,不知道克隆方法。刚刚分配给新变量的参数,然后修改它 – vladra

回答

1

你可以尝试重写lap_time=方法

class LapResult  
    def lap_time=(value) 
    lap_time_in_seconds = # ... logic to convert value MM:TT to integer 

    # set the value that will be saved to the database 
    self[:lap_time] = lap_time_in_seconds 
    end 
end 
+0

非常感谢,那就是我一直在寻找! 正确地将时间字符串转换为秒数,并在验证失败和页面重新加载的情况下重新显示数据。 现在剩下的唯一事情就是当页面由于验证失败而重新加载时,将整数转换为时间格式字符串。 你可以建议我可以在rails api中找到这个函数吗? – vladra