在前面我们重构了product中图片的实现,但是还是有一些小问题.比如用户如果上传一个非图片格式的文件时的验证情况.
我们之前是将图片格式验证代码放在picture类中:
但是我实际操作的是product类的对象,我怎么在图片格式错误时由picture通知product呢?
一种方法是在product的after_save中手动写代码判断picture的格式是否正确,类似如下:
但实际上,图片格式的验证应该放在图片中,而不能在其之外验证,因为图片最知道其的正确格式,product不可以代俎越庖.所以增加一个before_save方法,调用picture格式的验证;该验证不能放在after_save中,因为这时product已经保存过了:
代码中如果picture验证出错,则将其错误信息放入product的pic_tmp对象的errors中,这样在提交后就可以看到错误提示了.
最后别忘了要在after_save中添加pic_tmp.rewind语句,因为before_save中调用了pic_tmp.read,这时必须重新定位到数据开头,否则什么也读不到了.