我在 Rails 应用程序中使用回形针,并在我的模型中进行了以下三个验证
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 并进行了此验证。但这是有希望的,因为当用户没有附加照片时不会出现错误消息。