클립 : : 오류 : : 누락 요구 사항 유효성 검사기 레일 4 오류


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

도움이되도록 추가 자료를 보충 할 수 있는지 알려주십시오.

답변:


501

시작 Paperclip version 4.0, 모든 첨부 파일이 포함하는 데 필요한 콘텐츠 _ 검증 , 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

@rawonstack +1 대안을 제안 해 주셔서 감사합니다. :) 약간의 조정 후 답변에 포함 시켰습니다. presence: true유효성 검사는 필수가 아니므로 해당 부분을 제외했습니다.
— Kirti Thorat

1
PDF 파일 업로드시 클립에서 "Missing Required Validator Error"가 발생합니다. 이에 대한 해결 방법은 다음과 같습니다. 먼저 "GhostScript"를 설치 한 다음 "application / pdf"를 content-type에 추가하십시오.
— HackerKarma

정말 추천하지 않습니다 do_not_validate_attachment_file_type . Rdocs가 말한 것처럼 : Egor Homakov의 보고서 덕분에 우리는 사람들이 Content-Type을 스푸핑하지 않고 서버에서 예상하지 않은 데이터를 얻지 못하도록 조치를 취했습니다.
— user1322092

3
콘텐츠 유효성 검사를 수행하지 않는 가장 큰 이유는 첨부 파일이 사용자가 아니라 시스템 프로세스에 의해 생성되기 때문입니다. 클립은 S3 저장을위한 편의 계층입니다.
— s01ipsist


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에서 성공했습니다.


그래서 버전을 업그레이드
— 함으로써이

일종의. 최신 버전으로 시작했는데 현재 4.2.1입니다. 거기에 운이 없다. 그리고 다시 3.1로 운이 없다. 다른 곳에서 누군가가 3.5.1을 제안했고 그게 나를 위해 일했습니다.
— Ric
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.