天天看點

rails小重構:将圖檔加入産品Model之二

在前面我們重構了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,這時必須重新定位到資料開頭,否則什麼也讀不到了.