Ada*_*eod 0 ruby-on-rails attr ruby-on-rails-3
我重写了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
Run Code Online (Sandbox Code Playgroud)
我试图在验证期间有意义地报告此错误.我所拥有的前两个想法包含在代码示例中.
duration_string_valid
.检查其他验证是否失败,并报告duration_before_type_cast.在这种情况下,duration.is_valid?
这不是一个有效的方法,我不知道如何检查持续时间是否已通过其他验证.duration_string_valid
.我想知道这是否是一个很好的方法来进行此操作,以及如何改进错误报告.
首先,清理你的代码.将字符串移动到持续时间转换器到服务层.在lib/
目录内创建StringToDurationConverter
:
# lib/string_to_duration_converter.rb
class StringToDurationConverter
class << self
def convert(value)
value.to_s.split(/:/)
.map { |t| Integer(t) }
.reverse
.zip([60**0, 60**1, 60**2])
.map { |i,j| i*j }
.inject(:+)
end
end
end
Run Code Online (Sandbox Code Playgroud)
其次,添加自定义DurationValidator
验证器
# lib/duration_validator.rb
class DurationValidator < ActiveModel::EachValidator
# implement the method called during validation
def validate_each(record, attribute, value)
begin
StringToDurationConverter.convert(value)
resque ArgumentError
record.errors[attribute] << 'is not valid.'
end
end
end
Run Code Online (Sandbox Code Playgroud)
你的模型看起来像这样:
class Call < ActiveRecord::Base
attr_accessible :duration
validates :duration, :presence => true,
:numericality => { :greater_than_or_equal_to => 0 },
:duration => true
def duration=(value)
result = StringToDurationConverter.convert(value)
write_attribute(:duration, result)
end
end
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
423 次 |
最近记录: |