คลิปหนีบกระดาษ :: ข้อผิดพลาด :: MissingRequiredValidatorError with Rails 4


226

ฉันได้รับข้อผิดพลาดนี้เมื่อฉันพยายามอัปโหลดโดยใช้คลิปหนีบกระดาษกับแอพบล็อกของฉัน ไม่แน่ใจว่ามันหมายถึงอะไรเมื่อมีข้อความว่า "MissingRequiredValidatorError" ฉันคิดว่าการอัปเดต post_params และให้มัน: ภาพมันจะดีเพราะทั้งสร้างและอัปเดตใช้ 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สิ่งที่แนบมาทุกคนจะต้องรวมถึงการตรวจสอบ content_type , การตรวจสอบ file_nameหรืออย่างชัดเจนรัฐว่าพวกเขาจะไม่ได้มีอย่างใดอย่างหนึ่ง

Paperclip ทำให้เกิด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"] }

หรืออีกวิธีหนึ่ง

คือการใช้regexสำหรับการตรวจสอบประเภทเนื้อหา

ตัวอย่างเช่น: ในการตรวจสอบรูปแบบภาพทั้งหมดสามารถระบุนิพจน์ regex ตามที่แสดงใน

@ คำตอบของ LucasCaton

ตัวเลือก 2: ตรวจสอบชื่อไฟล์

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

ตัวเลือก 3: อย่าตรวจสอบ

ถ้าด้วยเหตุผลบางอย่างบ้าคลั่ง (สามารถถูกต้องแต่ฉันไม่สามารถคิดได้ในขณะนี้) คุณไม่ต้องการเพิ่มcontent_typeการตรวจสอบใด ๆและอนุญาตให้ผู้ใช้หลอกประเภทเนื้อหาและรับข้อมูลที่คุณไม่ได้คาดหวังบนเซิร์ฟเวอร์ของคุณจากนั้นเพิ่มสิ่งต่อไปนี้ :

do_not_validate_attachment_file_type :image

บันทึก:

ระบุประเภท MIME ตามความต้องการของคุณภายในcontent_type/ matchesตัวเลือกด้านบน ฉันเพิ่งกำหนดประเภท 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
Paperclip จะแสดงข้อความ "Missing Required Validator Error" ในกรณีที่อัพโหลดไฟล์ PDF วิธีแก้ปัญหาสำหรับคือ: ก่อนอื่นให้ติดตั้ง "GhostScript" แล้วเพิ่ม "application / pdf" ลงใน content-type
HackerKarma

do_not_validate_attachment_file_type ผมจะไม่แนะนำ ดังที่ Rdocs กล่าวถึง: ขอบคุณรายงานจาก Egor Homakov เราได้ดำเนินการขั้นตอนเพื่อป้องกันไม่ให้ผู้อื่นปลอมแปลงประเภทเนื้อหาและรับข้อมูลที่คุณไม่ได้คาดหวังไว้บนเซิร์ฟเวอร์ของคุณ
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


ดังนั้นอยากจะบอกว่าเราสามารถแก้ไขปัญหานี้ได้ด้วยการอัพเกรดรุ่น
Dharmesh Porwal

เรียงจาก ฉันเริ่มด้วยเวอร์ชั่นล่าสุดซึ่งตอนนี้คือ 4.2.1 ไม่มีโชคที่นั่นแล้วก็ไม่มีโชคอีกด้วย 3.1 (ซึ่งฉันพบว่าแนะนำไว้ที่นี่) คนอื่น (ฉันจำไม่ได้ว่าอยู่ที่ไหน) แนะนำ 3.5.1 และนั่นก็ใช้ได้กับฉัน
Ric
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.