Paperclip :: Errors :: MissingRequiredValidatorError with Rails 4


226

Railsブログアプリでクリップを使用してアップロードしようとすると、このエラーが発生します。"MissingRequiredValidatorError"と表示されている場合、それが何を指しているのかわからない

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

あなたが私を助けるのを助けるために私が追加の材料を補足できるかどうか私に知らせてください。

回答:


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-Typeを偽装し、サーバーに予期していなかったデータを受信できるようにしてから、以下を追加します。 :

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ファイルのアップロードの場合、「Missing Required Validator Error」をスローします。その回避策は、次のとおりです。まず「GhostScript」をインストールしてから、content-typeに「application / pdf」を追加します。
HackerKarma 2014年

私は本当にお勧めしませんdo_not_validate_attachment_file_type 。Rdocsが言うように:Egor Homakovからのレポートのおかげで、ユーザーがContent-Typeを偽装してサーバーに予期しないデータを取得するのを防ぐための措置を講じました。
user1322092 14

3
コンテンツの検証を行わない私のクレイジーな理由は、添付ファイルがユーザーによって作成されたのではなく、システムプロセスによって作成されたためです。ペーパークリップは、S3ストレージの便利なレイヤーです。
s01ipsist 2014年


4

モデルにvalidates_attachment_content_typeを追加する必要があります

Rails 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

Rails 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

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で成功しました。


したがって、バージョンをアップグレードすることでこの問題を
回避

ちょっと。私は最新バージョンから始めました。現在のバージョンは4.2.1です。そこでは運がなく、3.1でも運がありません(私がここで提案したことを発見しました)。他の誰か(どこか思い出せない)が3.5.1を提案しましたが、それでうまくいきました。
Ric
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.