2014-09-24 78 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