2014-09-24 115 views
0

如果我有兩個模型,並且正在使用accepts_nested_attributes_for我應該在哪兒爲我的孩子模型進行驗證。在哪裏執行驗證

例如;如果我想驗證圖像大小和限制(即只允許用戶上傳3張)我應該在我使用carrierwave上傳我的圖片動物或AnimalImage模型

class Animal < ActiveRecord::Base 
    has_many :animal_images, dependent: :destroy 
    accepts_nested_attributes_for :animal_images, allow_destroy: :true 
end 


class AnimalImage < ActiveRecord::Base 
    mount_uploader :image, AnimalImageUploader 
    belongs_to :animal 
end 

進行驗證。我注意到他們有一些內置的輔助方法,但是從例子中我所見過的圖像總是在父模型(即具有化身的用戶)

任何幫助表示讚賞

感謝

回答

2

如果你想限制每個Animal的圖像數量,你必須將這個驗證添加到Animal模型中。如果您想驗證單個圖像上的某些內容(例如文件類型,大小等),那麼這些將轉到AnimalImage模型。

例如:

class Animal 
    validate :limit_num_of_images 

    def limit_num_of_images 
    errors.add(:animal_images, :less_than_or_equal_to, count: 3) if animal_images.size > 3 
    end 
end 

這個例子很簡單,但它應該讓你開始。例如,缺少一件有關有效圖像的檢查。您可能只想考慮有效圖像的數量。

+0

謝謝,這個驗證會在圖片創建後發生,雖然不是嗎?它可以在以前完成嗎? – Richlewis 2014-09-24 10:47:04

+0

不確定你的意思是「創建」。通常情況下,如果任何驗證失敗,則父項和子項記錄被插入到ROLLBACKed事務中。然後,剩下的內存對象不會保存到數據庫中。沿着這條路徑的某處,Carrierwave將文件保存到磁盤。我不記得事件和回調的具體順序,但可能最終會在磁盤上留下剩餘的文件。不過,你永遠不應該在數據庫中得到任何記錄。 – Teoulas 2014-09-24 10:56:21

+0

不,我沒有在數據庫中得到任何東西,我可以看到在控制檯中的回滾..ahh仔細檢查後,它正在使用一個tmp文件,然後用戶必須刪除已超過極限的圖像 – Richlewis 2014-09-24 11:08:03