我正在覆盖 ActiveRecord 中的属性访问器,以将格式为“hh:mm:ss”的字符串转换为秒。这是我的代码:
class Call < ActiveRecord::Base
attr_accessible :duration
def duration=(val)
begin
result = val.to_s.split(/:/)
.map { |t| Integer(t) }
.reverse
.zip([60**0, 60**1, 60**2])
.map { |i,j| i*j }
.inject(:+)
rescue ArgumentError
#TODO: How can I correctly report this error?
errors.add(:duration, "Duration #{val} is not valid.")
end
write_attribute(:duration, result)
end
validates :duration, :presence => true,
:numericality => { :greater_than_or_equal_to => 0 }
validate :duration_string_valid
def duration_string_valid
if !duration.is_valid? and duration_before_type_cast
errors.add(:duration, "Duration #{duration_before_type_cast} is not valid.")
end
end
end
我正在尝试在验证期间有意义地报告此错误。我的前两个想法包含在代码示例中。
- 添加到访问器覆盖内的错误 - 有效,但我不确定它是否是一个不错的解决方案。
- 使用验证方法
duration_string_valid
。检查其他验证是否失败并报告 duration_before_type_cast。在这种情况下,这duration.is_valid?
不是一个有效的方法,我不确定如何检查持续时间是否已通过其他验证。 - 我可以在 duration=(val) 内设置一个实例变量并在
duration_string_valid
.
我希望得到一些关于这是否是进行此操作的好方法以及如何改进错误报告的反馈。