0
我重寫了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
之內報告它。
我很想反饋一下這是否是一種很好的方法來執行此操作,以及如何改進錯誤報告。
偉大的答案。但是我們不能在持續時間上有兩個相互衝突的驗證器 - DurationValidator和NumericalityValidator。 Duration是一個可由DurationValidator驗證的散列。我們不能同時使用數字驗證器來驗證持續時間爲秒數。 – Salil