【问题标题】:Smarter paperclip validations更智能的回形针验证
【发布时间】:2010-02-13 09:13:18
【问题描述】:

我在 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 并进行了此验证,但它并不能很好地工作。但这是有希望的,因为当用户没有附加照片时,错误消息不会出现。

【问题讨论】:

  • 您使用的是哪个版本的回形针?我有 2.3.1.1,你所描述的对我来说是自动发生的。如果没有附加文件,它只会返回该错误。如果我附加了一个文件,但大小和内容类型验证失败,则会显示这些错误。
  • 很奇怪,因为我也在使用 2.3.1.1 的插件......无论如何我都会接受下面关于创建我自己的自定义错误消息的建议,因为我真的不喜欢他们告诉你附件需要在 0 到 X 字节之间的方式......
  • 我正在使用 2.3.2 遇到同样的问题

标签: ruby-on-rails model paperclip validation


【解决方案1】:
validates_attachment_size :photo, :less_than => 1.megabyte, 
  :unless => Proc.new { |imports| imports.photo_file_name.blank? }

【讨论】:

  • 比这更好::if => Proc.new { |imports| !imports.photo.file? }
  • 我不知道这个答案是在哪个版本上给出的,但它不适用于我的本地系统(在 Rails 3.1.3 上运行 Paperclip 2.3.11)。
【解决方案2】:

我认为您可以通过其他方式进行操作。不要搞乱验证。您的表单中可能有这样的内容:

<%= f.error_messages %>

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

@photo.errors

或者如果您想通过表单生成器访问它们:

f.object.errors

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 2013-08-28
    • 1970-01-01
    • 2015-10-10
    相关资源
    最近更新 更多