页面上有一个 jquery datepicker 通过表单向后台提交一个 1/3/2014 格式的字符串,我的 monoid 对应的 field 是
field :date, type :DateTime
于是,我重写了
def date= d
if d.match(/\d{1,2}\/\d{1,2}\/\d{4}/)
#根据d生成一个DateTime 然后super
else
#错误处理
errors.add(:date, "不正确的日期")
end
end
为什么 save 失败过后我在这里添加过的错误信息就消失了?
正解: rails 在执行 validation 之前会把 errors 里的错误信息全部清空。setter 中遇到的错误信息可以暂时放在全部变量中,validate 时再放到 errors 中去。
field :date, type :DateTime
validate :get_setter_errors
def date= d
if d.match(/\d{1,2}\/\d{1,2}\/\d{4}/)
#根据d生成一个DateTime 然后super
else
setter_errors_add(:date, "错误的日期格式!")
end
end
def get_setter_errors
@setter_errors.each do |k,v|
errors.add(k,v)
end
end
def setter_errors_add(field,message)
@setter_errors = Hash.new if @setter_errors.nil?
@setter_errors[field] = message
end