Rails Model 中自定义 setter 中的错误处理

crazyjin · 2014年01月10日 · 最后由 crazyjin 回复于 2014年01月10日 · 2637 次阅读

页面上有一个 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
需要 登录 后方可回复, 如果你还没有账号请 注册新账号