更智能的回形针validation

我在rails应用程序中使用paperclip,并在我的模型中进行以下三次validation

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'] 

如果用户忘记添加附件,则所有三个validation都会失败,因此会向用户显示以下三个错误:

 # 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 

我认为最好只显示此实例中的第一个错误,因为其他两个错误纯粹是后果…我希望用户只有在添加附件但不符合时才会看到后两个错误validation标准。

我确定没有预先出现的validation可以做这种事情,并且通过阅读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 

但这打破了应用程序。 有没有经验做过这种事情? 对回形针源代码的贡献很大。

编辑:

我试过用这个:

 validates_attachment_size :photo, :less_than=>1.megabyte, :unless=> Proc.new { |image| image[:photo].nil? } 

虽然因为我已经设法上传了一个带有这个validation的5mb mp3,但它并没有完全奏效。 但它很有希望,因为当用户没有附加照片时,不会出现错误消息。

 validates_attachment_size :photo, :less_than => 1.megabyte, :unless => Proc.new { |imports| imports.photo_file_name.blank? } 

我想你可以通过其他方式做到这一点。 不要乱用validation。 您的表单中可能包含以下内容:

 <%= f.error_messages %> 

您可以删除它并编写自己的帮助程序来显示错误消息。 错误存储在哈希中:

 @photo.errors 

或者,如果您想通过表单构建器访问它们:

 f.object.errors