Ataç :: Hatalar :: Rails 4 ile MissingRequiredValidatorError


226

Raylarım blog uygulaması ile ataç kullanarak yüklemeye çalıştığımda bu hatayı alıyorum. "MissingRequiredValidatorError" derken neye atıfta bulunduğundan emin değilim Post_params güncelleyerek ve vererek: görüntü hem oluşturmak ve güncelleme post_params kullanmak gibi, iyi olacağını düşündüm

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

Extracted source (around line #30):

def create
  @post = Post.new(post_params)

Bu benim 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    

ve bu benim mesajım yardımcısı

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

Bana yardımcı olmak için ekstra malzeme ekleyebilir miyim lütfen bana bildirin.

Yanıtlar:


501

İle başlayarak Paperclip version 4.0, tüm eklerin bir content_type doğrulaması , bir dosya_adı doğrulaması içermesi veya bunların hiçbirinin olmayacağını açıkça belirtmesi gerekir.

Bunlardan Paperclip::Errors::MissingRequiredValidatorErrorherhangi birini yapmazsanız ataç hata verir.

Sizin durumunuzda, size aşağıdaki hattının herhangi ekleyebilir Post, modelin sonra belirterekhas_attached_file :image

1. Seçenek: İçerik türünü doğrulayın

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

-VEYA- başka bir yol

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

-VEYA- başka bir yol

içerik türünü doğrulamak için normal ifade kullanmaktır .

Örneğin: Tüm görüntü formatlarını doğrulamak için normal ifade ifadesi,

@ LucasCaton'un cevabı

2. Seçenek: Dosya adını doğrulama

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

3. Seçenek: Doğrulama

Bazı çılgın nedenlerden dolayı ( geçerli olabilir, ancak şu anda bir tane düşünemiyorum), herhangi bir content_typedoğrulama eklemek istemiyor ve insanların İçerik Türlerini taklit etmelerine ve sunucunuza beklemediğiniz verileri almasına izin vermek istemiyorsunuz, ardından aşağıdakileri ekleyin :

do_not_validate_attachment_file_type :image

Not:

MIME tiplerini ihtiyacınıza göre yukarıdaki content_type/ matchesseçeneklerden belirtin . Başlamanız için birkaç resim MIME türü verdim.

Referans:

Hala doğrulamanız gerekiyorsa Ataç: Güvenlik Doğrulamaları bölümüne bakın . :)

Ayrıca burada açıklanan kimlik sahtekarlığı doğrulamasıyla da uğraşmanız gerekebilir https://stackoverflow.com/a/23846121


3
Doğrulayıcılar ayrıca yeni yardımcı stil kullanılarak tanımlanabilir, örn. validates_attachment :image, presence: true, content_type: { content_type: ["image/jpg", "image/jpeg", "image/png"] }
rawonstack

@rawonstack +1 Alternatifi önerdiğiniz için teşekkür ederiz. :) Ben küçük bir tweak sonra cevap dahil ettim. presence: truedoğrulama zorunlu değildir, bu yüzden bu kısmı hariç tuttum.
Kirti Thorat

1
ATAÇ ayrıca PDF dosyası yüklemesi durumunda "Gerekli Gerekli Doğrulayıcı Hatası" nı atar. Bunun çözümü: Önce "GhostScript" i yükleyin ve ardından içerik türüne "application / pdf" ekleyin.
HackerKarma

Gerçekten tavsiye etmem do_not_validate_attachment_file_type . Rdocs'un söylediği gibi: Egor Homakov'un bir raporu sayesinde, insanların İçerik Türlerini taklit etmesini ve sunucunuza beklemediğiniz verileri almasını önlemek için adımlar attık.
user1322092

3
İçerik doğrulaması yapmamın çılgın sebebim, ekin kullanıcılar tarafından değil bir sistem işlemi tarafından oluşturulmasıdır. Ataç S3 depolama için uygun bir katmandır.
s01ipsist


4

Modelde validates_attachment_content_type eklemeniz gerekiyor

Raylar 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

Raylar 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

Gönderi modelinizin böyle göründüğünden emin olun ...

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

Bu çözümlerin hiçbirini de çalıştıramadım. Paperclip 3.1'i denedim, ancak uygulamam jpg olmasına rağmen resim dosya uzantılarımın onaylanmadığını söyleyemedi.

Sonunda 3.5.1 sürümü ile başarı buldum.


yani sürüm yükseltme ile bu sorunu
aşabilirsiniz

Bir çeşit. Şu anda 4.2.1 olan en son sürümle başladım. Şans yok, sonra yine şanssız 3.1 ile (ki burada önerilen bulundu). Başka bir yerde (hatırlayamıyorum) 3.5.1 önerdi ve bu benim için çalıştı.
Ric
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.