Paperclip :: Error :: MissingRequiredValidatorError với Rails 4


226

Tôi đang gặp lỗi này khi tôi cố tải lên bằng kẹp giấy với ứng dụng viết blog. Không chắc nó đề cập đến điều gì khi nói "MissingRequiredValidatorError" Tôi nghĩ rằng bằng cách cập nhật post_params và cho nó: hình ảnh sẽ ổn, vì cả tạo và cập nhật đều sử dụng post_params

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

Extracted source (around line #30):

def create
  @post = Post.new(post_params)

Đây là bài viết của tôi_controll.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    

và đây là người trợ giúp bài viết của tôi

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

Xin vui lòng cho tôi biết nếu tôi có thể bổ sung thêm tài liệu để giúp bạn giúp tôi.

Câu trả lời:


501

Bắt đầu với Paperclip version 4.0, tất cả các tệp đính kèm được yêu cầu bao gồm xác thực content_type , xác thực file_name hoặc nói rõ rằng chúng sẽ không có.

Paperclip tăng Paperclip::Errors::MissingRequiredValidatorErrorlỗi nếu bạn không làm điều này.

Trong trường hợp của bạn, bạn có thể thêm bất kỳ dòng nào sau đây vào Postmô hình của mình , sau khi chỉ địnhhas_attached_file :image

Tùy chọn 1: Xác thực loại nội dung

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

-OR- một cách khác

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

-OR- nhưng cách khác

là sử dụng regex để xác nhận loại nội dung.

Ví dụ: Để xác thực tất cả các định dạng hình ảnh, biểu thức regex có thể được chỉ định như thể hiện trong

Câu trả lời của LucasCaton

Tùy chọn 2: Xác thực tên tệp

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

Tùy chọn 3: Không xác thực

Nếu vì một lý do điên rồ nào đó (có thể hợp lệ nhưng tôi không thể nghĩ ra ngay bây giờ), bạn không muốn thêm bất kỳ content_typexác thực nào và cho phép mọi người giả mạo Loại nội dung và nhận dữ liệu bạn không mong đợi vào máy chủ của mình sau đó thêm vào sau :

do_not_validate_attachment_file_type :image

Ghi chú:

Chỉ định các loại MIME theo yêu cầu của bạn trong content_type/ matchestùy chọn ở trên. Tôi vừa đưa ra một vài loại hình ảnh MIME để bạn bắt đầu.

Tài liệu tham khảo:

Tham khảo Paperclip: Xác thực bảo mật , nếu bạn vẫn cần xác minh. :)

Bạn cũng có thể phải đối phó với xác thực giả mạo được giải thích tại đây https://stackoverflow.com/a/23846121


3
Trình xác nhận cũng có thể được xác định bằng cách sử dụng kiểu trình trợ giúp mới, vd. validates_attachment :image, presence: true, content_type: { content_type: ["image/jpg", "image/jpeg", "image/png"] }
rawonstack

@rawonstack +1 Cảm ơn bạn đã đề xuất giải pháp thay thế. :) Tôi đã bao gồm điều đó trong câu trả lời sau một chút điều chỉnh. presence: truexác nhận là không bắt buộc nên tôi đã loại trừ phần đó.
Kirti Thorat

1
Paperclip cũng sẽ đưa ra "Lỗi Trình xác thực bắt buộc" trong trường hợp tải lên tệp PDF. Giải pháp cho điều đó là: Đầu tiên cài đặt "GhostScript" và sau đó thêm "application / pdf" vào loại nội dung.
HackerKarma

Tôi thực sự không muốn giới thiệu do_not_validate_attachment_file_type . Như Rdocs đưa ra: Nhờ một báo cáo từ Egor Homakov, chúng tôi đã thực hiện các bước để ngăn mọi người giả mạo Loại nội dung và nhận dữ liệu mà bạn không mong đợi trên máy chủ của mình.
user1322092

3
Lý do điên rồ của tôi khi không thực hiện xác nhận nội dung là vì tệp đính kèm không phải do người dùng tạo mà là do một quy trình hệ thống. Paperclip là lớp tiện lợi cho việc lưu trữ S3.
s01ipsist


4

Cần thêm validates_attachment_content_type trong Model

Đường ray 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

Đường ray 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
Thật tốt khi biết điều này @zire
Arvind singh

0

Hãy chắc chắn rằng mô hình bài viết của bạn trông như thế này ...

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

Tôi cũng không thể có được bất kỳ giải pháp nào trong số này. Tôi đã dùng thử Paperclip 3.1, nhưng không thể sau đó ứng dụng của tôi liên tục cho tôi biết các phần mở rộng tệp hình ảnh của tôi không được chấp thuận, mặc dù chúng là jpg.

Cuối cùng tôi đã tìm thấy thành công với phiên bản 3.5.1.


vì vậy muốn nói rằng người ta có thể khắc phục vấn đề này bằng cách nâng cấp phiên bản
Dharmesh Porwal

Sắp xếp Tôi đã bắt đầu với phiên bản mới nhất, mà ngay bây giờ là 4.2.1. Không có may mắn ở đó, sau đó một lần nữa không có may mắn với 3,1 (mà tôi tìm thấy gợi ý ở đây). Một người nào đó ở nơi khác (tôi không thể nhớ nơi nào) đã đề xuất 3.5.1 và điều đó hiệu quả với tôi.
Ric
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.