在前面我们重构了product中图片的实现,但是还是有一些小问题.比如用户如果上传一个非图片格式的文件时的验证情况.
我们之前是将图片格式验证代码放在Picture类中:
validates_format_of :content_type,with:/\Aimage/,
message:"you can only upload picture format"
但是我实际操作的是Product类的对象,我怎么在图片格式错误时由picture通知product呢?
一种方法是在product的after_save中手动写代码判断picture的格式是否正确,类似如下:
def after_save
if pic_tmp
if pic_tmp.format_error
#do something!!!
end
end
end
但实际上,图片格式的验证应该放在图片中,而不能在其之外验证,因为图片最知道其的正确格式,product不可以代俎越庖.所以增加一个before_save方法,调用picture格式的验证;该验证不能放在after_save中,因为这时product已经保存过了:
def before_save
if pic_tmp
pic = Picture.new
pic.uploaded_picture(pic_tmp)
if pic.invalid?
errors.add(:pic_tmp,pic.errors.messages.values.join(""))
return false
end
end
end
代码中如果picture验证出错,则将其错误信息放入product的pic_tmp对象的errors中,这样在提交后就可以看到错误提示了.
最后别忘了要在after_save中添加pic_tmp.rewind语句,因为before_save中调用了pic_tmp.read,这时必须重新定位到数据开头,否则什么也读不到了.