Rails 4的回形针:: Errors :: MissingRequiredValidatorError


226

尝试在Rails博客应用中使用回形针进行上传时出现此错误。不知道当它说“ MissingRequiredValidatorError”时指的是什么,我认为通过更新post_params并给它:image会很好,因为创建和更新都使用post_params

Paperclip::Errors::MissingRequiredValidatorError in PostsController#create
Paperclip::Errors::MissingRequiredValidatorError

Extracted source (around line #30):

def create
  @post = Post.new(post_params)

这是我的posts_controller.rb

def update
  @post = Post.find(params[:id])

  if @post.update(post_params)
    redirect_to action: :show, id: @post.id
  else
    render 'edit'
  end
end

def new
  @post = Post.new
end

def create
  @post = Post.new(post_params)

  if @post.save
    redirect_to action: :show, id: @post.id
  else
    render 'new'
  end
end
#...

private

def post_params
  params.require(:post).permit(:title, :text, :image)
end    

这是我的帖子助手

module PostsHelper
  def post_params
    params.require(:post).permit(:title, :body, :tag_list, :image)
  end
end

请让我知道是否可以补充其他材料以帮助您。

Answers:


501

从开始Paperclip version 4.0,所有附件都必须包括content_type验证file_name验证,或明确声明它们都不具备。

Paperclip::Errors::MissingRequiredValidatorError如果不执行任何操作,回形针将引发错误。

根据您的情况,您可以指定以下内容后将以下任意行添加到Post模型中has_attached_file :image

选项1:验证内容类型

validates_attachment_content_type :image, :content_type => ["image/jpg", "image/jpeg", "image/png", "image/gif"]

-或-另一种方式

validates_attachment :image, content_type: { content_type: ["image/jpg", "image/jpeg", "image/png", "image/gif"] }

-或-另一种方式

使用正则表达式验证内容类型。

例如:要验证所有图像格式,可以指定正则表达式,如下所示:

@LucasCaton的答案

选项2:验证文件名

validates_attachment_file_name :image, :matches => [/png\Z/, /jpe?g\Z/, /gif\Z/]

选项3:不验证

如果出于某种疯狂的原因(可能是有效的,但我现在想不起来),您不希望添加任何content_type验证,而是允许人们欺骗Content-Types并将不希望的数据接收到服务器上,则添加以下内容:

do_not_validate_attachment_file_type :image

注意:

根据您的要求在上述content_type/ matches选项中指定MIME类型。我刚刚为您提供了一些图像MIME类型。

参考:

如果仍然需要验证,请参阅回形针:安全性验证。:)

您可能还必须处理此处解释的欺骗验证:https://stackoverflow.com/a/23846121


3
验证程序也可以使用新的帮助程序样式进行定义,例如。 validates_attachment :image, presence: true, content_type: { content_type: ["image/jpg", "image/jpeg", "image/png"] }
rawonstack 2014年

@rawonstack +1感谢您提出替代方案。:)经过一些调整后,我已将其包含在内。presence: true验证不是强制性的,因此我已经排除了这一部分。
Kirti Thorat

1
如果上传PDF文件,回形针还将抛出“缺少所需的验证器错误”。解决方法是:首先安装“ GhostScript”,然后将“ application / pdf”添加到content-type。
HackerKarma 2014年

我真的不推荐do_not_validate_attachment_file_type 。正如Rdocs所说:感谢Egor Homakov的一份报告,我们已经采取了一些措施,以防止人们欺骗Content-Types并将意外的数据获取到服务器上。
user1322092 2014年

3
我不进行内容验证的疯狂原因是因为附件不是由用户创建的,而是由系统进程创建的。回形针是S3存储的便利层。
s01ipsist 2014年


4

需要在模型中添加validates_attachment_content_type

导轨3

class User < ActiveRecord::Base
attr_accessible :avatar
has_attached_file :avatar, :styles => { :medium => "300x300>", :thumb => "100x100>" }, :default_url => "/images/:style/missing.png"
validates_attachment_content_type :avatar, :content_type => /\Aimage\/.*\Z/ 
end

滑轨4

class User < ActiveRecord::Base
has_attached_file :avatar, :styles => { :medium => "300x300>", :thumb => "100x100>" }, :default_url => "/images/:style/missing.png"
validates_attachment_content_type :avatar, :content_type => /\Aimage\/.*\Z/
end

1
很高兴知道这个@zire
Arvind singh

0

确保您的帖子模型看起来像这样...

class Post < ActiveRecord::Base
    has_attached_file :photo
    validates_attachment_content_type :photo, :content_type => ["image/jpg", "image/jpeg", "image/png", "image/gif"]
end

-1

我也无法使用任何这些解决方案。我尝试过Paperclip 3.1,但后来我的应用程序一直告诉我我的图像文件扩展名未被批准,即使它们是jpg也无法通过。

我终于在3.5.1版中找到了成功。


所以想说可以通过升级版本来解决这个问题
Dharmesh Porwal 2014年

有点。我从最新版本开始,现在是4.2.1。那里没有运气,然后3.1也没有运气(我在这里发现了建议)。其他地方的某个人(我不记得在哪里)建议3.5.1,这对我有用。
Ric 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.