更智能的回形针验证

ste*_*och 19 validation model ruby-on-rails paperclip

我在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'] 
Run Code Online (Sandbox Code Playgroud)

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

# 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
Run Code Online (Sandbox Code Playgroud)

我认为最好只显示此实例中的第一个错误,因为其他两个错误纯粹是后果...我希望用户只看到后两个错误,如果已添加附件但不符合验证标准.

我确定没有预先出现的验证可以做这种事情,并且通过阅读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
Run Code Online (Sandbox Code Playgroud)

所以,我在想我可以做以下事情:

validates_attachment_size :photo, :less_than=>1.megabyte, :unless=> :photo.blank
Run Code Online (Sandbox Code Playgroud)

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

编辑:

我试过用这个:

validates_attachment_size :photo, :less_than=>1.megabyte, 
     :unless=> Proc.new { |image| image[:photo].nil? }
Run Code Online (Sandbox Code Playgroud)

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

小智 29

validates_attachment_size :photo, :less_than => 1.megabyte, 
  :unless => Proc.new { |imports| imports.photo_file_name.blank? }
Run Code Online (Sandbox Code Playgroud)


kle*_*lew 5

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

<%= f.error_messages %>
Run Code Online (Sandbox Code Playgroud)

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

@photo.errors
Run Code Online (Sandbox Code Playgroud)

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

f.object.errors
Run Code Online (Sandbox Code Playgroud)