在到达params之前修改表单字段(Rails 4)

时间:2014-04-12 22:16:42

标签: ruby-on-rails forms

在互联网上搜索但无法找到问题的答案..

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

我尝试了两种解决方案:

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

现在,如果我调用before_validation或其他回调的before_save,我将使用数字11进行操作,因为race_result.lap_time现在为11.我猜它会自动更改,因为列数据类型是整数。

2)我也尝试在传递给新的LapResult模型之前更改params(或复制的params变量)。这种方法非常适合我正在寻找的东西 - 时间成功转换为整数,但后来遇到了另一个问题 如果用户输入由于某种原因没有通过验证,则当页面重新加载时,params不会转移到表单,用户必须再次输入所有数据。这是一个问题,因为有时在比赛中最多可以跑20圈。

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

来自rails guru的任何建议? 提前谢谢。

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

1 个答案:

答案 0 :(得分: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