Paperclip :: Errors :: MissingRequiredValidatorError with Rails 4

226

Saya mendapatkan kesalahan ini ketika saya mencoba mengunggah menggunakan penjepit kertas dengan aplikasi blogging rails saya. Tidak yakin apa yang dimaksud ketika mengatakan "MissingRequiredValidatorError" Saya berpikir bahwa dengan memperbarui post_params dan memberikannya: gambar itu akan baik-baik saja, karena keduanya membuat dan memperbarui menggunakan post_params

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

Extracted source (around line #30):

def create
  @post = Post.new(post_params)

Ini adalah posts_controller.rb saya

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    

dan ini adalah pembantu posting saya

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

Harap beri tahu saya jika saya dapat menambah bahan tambahan untuk membantu Anda membantu saya.

nadia
sumber

Jawaban:

501

Dimulai dengan Paperclip version 4.0, semua lampiran wajib menyertakan validasi content_type , validasi file_name , atau secara eksplisit menyatakan bahwa mereka tidak akan memilikinya.

Penjepit kertas memunculkan Paperclip::Errors::MissingRequiredValidatorErrorkesalahan jika Anda tidak melakukan hal ini.

Dalam kasus Anda, Anda dapat menambahkan baris berikut ke Postmodel Anda , setelah menentukanhas_attached_file :image

Opsi 1: Validasi jenis konten

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

-Atau- cara lain

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

-Atau- cara lain

adalah menggunakan regex untuk memvalidasi tipe konten.

Misalnya: Untuk memvalidasi semua format gambar, ekspresi regex dapat ditentukan seperti yang ditunjukkan pada

@ LucasCaton menjawab

Opsi 2: Validasikan nama file

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

Opsi 3: Jangan validasi

Jika karena alasan gila (bisa valid tetapi saya tidak bisa memikirkannya sekarang), Anda tidak ingin menambahkan content_typevalidasi apa pun dan mengizinkan orang untuk memalsukan Tipe-Konten dan menerima data yang tidak Anda harapkan ke server Anda kemudian tambahkan yang berikut :

do_not_validate_attachment_file_type :image

catatan:

Tentukan jenis MIME sesuai kebutuhan Anda dalam content_type/ matchesopsi di atas. Saya baru saja memberikan beberapa tipe gambar MIME untuk Anda mulai.

Referensi:

Rujuk ke Penjepit Kertas: Validasi Keamanan , jika Anda masih perlu memverifikasi. :)

Anda mungkin juga harus berurusan dengan validasi spoofing yang dijelaskan di sini https://stackoverflow.com/a/23846121

Kirti Thorat
sumber
3
Validator juga dapat didefinisikan menggunakan gaya pembantu baru, misalnya. validates_attachment :image, presence: true, content_type: { content_type: ["image/jpg", "image/jpeg", "image/png"] }
rawonstack
@rawonstack +1 Terima kasih telah menyarankan alternatif. :) Saya telah memasukkan itu dalam jawaban setelah sedikit tweak. presence: truevalidasi tidak wajib jadi saya telah mengecualikan bagian itu.
Kirti Thorat
1
Paperclip juga akan menampilkan "Kesalahan Validator yang Diperlukan Tidak Ada" jika terjadi pengunggahan file PDF. Solusi untuk itu adalah: Pertama instal "GhostScript" dan kemudian tambahkan "application / pdf" ke tipe konten.
HackerKarma
Saya benar-benar tidak akan merekomendasikan do_not_validate_attachment_file_type . Seperti yang dikatakan Rdocs: Terima kasih atas laporan dari Egor Homakov, kami telah mengambil langkah-langkah untuk mencegah orang-orang dari memalsukan Tipe-Konten dan mendapatkan data yang tidak Anda harapkan ke server Anda.
user1322092
3
Alasan gila saya untuk tidak melakukan validasi konten adalah karena lampiran tidak dibuat oleh pengguna tetapi oleh proses sistem. Penjepit kertas adalah lapisan praktis untuk penyimpanan S3.
s01ipsist
4

Perlu menambahkan validates_attachment_content_type dalam Model

Rel 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

Rel 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
Arvind singh
sumber
1
Senang mengetahui @zire ini
Arvind singh
0

Pastikan model posting Anda terlihat seperti ini ...

class Post < ActiveRecord::Base
    has_attached_file :photo
    validates_attachment_content_type :photo, :content_type => ["image/jpg", "image/jpeg", "image/png", "image/gif"]
end
shriyog
sumber
-1

Saya juga tidak bisa mendapatkan solusi ini untuk bekerja. Saya mencoba Paperclip 3.1, tetapi kemudian aplikasi saya tetap memberi tahu saya bahwa ekstensi file gambar saya tidak disetujui, meskipun itu jpg.

Saya akhirnya menemukan kesuksesan dengan versi 3.5.1.

Ric
sumber
jadi ingin mengatakan bahwa seseorang dapat mengatasi masalah ini dengan memutakhirkan versi
Dharmesh Porwal
Semacam. Saya mulai dengan versi terbaru, yang saat ini 4.2.1. Tidak ada keberuntungan di sana, sekali lagi tidak ada keberuntungan dengan 3.1 (yang saya temukan disarankan di sini). Seseorang di tempat lain (saya tidak ingat di mana) menyarankan 3.5.1, dan itu berhasil untuk saya.
Ric