我在Rails应用中使用Paperclip,在我的模型中有以下三个验证:
validates_attachment_presence :photo
validates_attachment_size :photo, :less_than=>1.megabyte
validates_attachment_content_type :photo, :content_type=>['image/jpeg', 'image/png', 'image/gif']
如果用户忘记添加附件,则所有三个验证都将失败,因此用户将看到以下三个错误:
# Photo file name must be set.
# Photo file size file size must be between 0 and 1048576 bytes.
# Photo content type is not included in the list
我认为在这种情况下最好只显示第一个错误,因为其他两个错误纯粹是顺带的。如果添加了附件但不符合验证标准,则我希望用户只能看到后面两个错误。
我确信没有预先制作的验证可以做到这一点,并且从阅读vendor/plugins/paperclip/lib/paperclip.rb中的代码中,我发现validates_attachment_size方法支持:unless参数,如下所示:
def validates_attachment_presence name, options = {}
message = options[:message] || "must be set."
validates_presence_of :"#{name}_file_name",
:message => message,
:if => options[:if],
:unless => options[:unless]
end
所以,我在想我可以做类似下面这样的事情:
validates_attachment_size :photo, :less_than=>1.megabyte, :unless=> :photo.blank
但是这样会破坏应用程序。有没有人有这样做的经验?这将是对Paperclip源代码的一个不错的贡献。
编辑:
我已经尝试使用了这个:
validates_attachment_size :photo, :less_than=>1.megabyte,
:unless=> Proc.new { |image| image[:photo].nil? }
但是实际上它并不起作用,因为我刚刚成功上传了一个5mb的mp3文件,并且在此次验证中没有出现错误信息。但这很有前途,因为当用户未附加照片时,错误消息不会出现。