클립 : : 오류 : : 누락 요구 사항 유효성 검사기 레일 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.