我在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
但这打破了应用程序。有没有经验做过这种事情?这将是对回形针源代码的一个很好的贡献。
编辑:
我尝试过使用它:
validates_attachment_size :photo, :less_than=>1.megabyte,
:unless=> Proc.new { |image| image[:photo].nil? }
虽然我已经设法通过此验证上传了5mb mp3,但它并没有完全奏效。但它很有希望,因为当用户没有附加照片时,不会出现错误消息。
答案 0 :(得分:29)
validates_attachment_size :photo, :less_than => 1.megabyte,
:unless => Proc.new { |imports| imports.photo_file_name.blank? }
答案 1 :(得分:5)
我认为你可以通过其他方式做到这一点。不要乱用验证。您可能在表单中有类似的内容:
<%= f.error_messages %>
您可以将其删除并编写自己的帮助程序以显示错误消息。错误存储在哈希:
中@photo.errors
或者如果您想通过表单构建器访问它们:
f.object.errors