Paperclip :: Errori :: MissingRequiredValidatorError con Rails 4


226

Ricevo questo errore quando provo a caricare utilizzando la graffetta con la mia app di blog di rails. Non sono sicuro di cosa si riferisca quando dice "MissingRequiredValidatorError" Ho pensato che aggiornando post_params e dandolo: immagine andrebbe bene, dato che sia creare che aggiornare usano post_params

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

Extracted source (around line #30):

def create
  @post = Post.new(post_params)

Questo è il mio 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    

e questo è il mio aiuto post

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

Per favore fatemi sapere se posso integrare materiale aggiuntivo per aiutarvi ad aiutarmi.

Risposte:


501

A partire da Paperclip version 4.0, tutti gli allegati devono includere una convalida del tipo di contenuto , una convalida del nome_file o per dichiarare esplicitamente che non avranno neanche.

La graffetta genera Paperclip::Errors::MissingRequiredValidatorErrorerrore se non si esegue alcuna operazione.

Nel tuo caso, puoi aggiungere una delle seguenti righe al tuo Postmodello, dopo aver specificatohas_attached_file :image

Opzione 1: convalida del tipo di contenuto

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

-O- un altro modo

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

-Oppure- un altro modo

è usare regex per convalidare il tipo di contenuto.

Ad esempio: per convalidare tutti i formati di immagine, è possibile specificare l'espressione regex come mostrato in

@ Risposta di LucasCaton

Opzione 2: convalida del nome file

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

Opzione 3: non convalidare

Se per qualche motivo folle (può essere valido ma non riesco a pensarne uno in questo momento), non desideri aggiungere alcuna content_typeconvalida e consentire alle persone di falsificare i tipi di contenuto e ricevere i dati che non ti aspettavi sul tuo server, quindi aggiungi quanto segue :

do_not_validate_attachment_file_type :image

Nota:

Specificare i tipi MIME secondo il requisito in content_type/ matchesopzioni sopra. Ho appena dato alcuni tipi di immagini MIME per iniziare.

Riferimento:

Fare riferimento a Paperclip: Convalide della sicurezza , se è ancora necessario verificarlo. :)

Potrebbe anche essere necessario gestire la convalida dello spoofing spiegata qui https://stackoverflow.com/a/23846121


3
I validatori possono anche essere definiti usando il nuovo stile di supporto, ad es. validates_attachment :image, presence: true, content_type: { content_type: ["image/jpg", "image/jpeg", "image/png"] }
rawonstack

@rawonstack +1 Grazie per aver suggerito l'alternativa. :) L'ho incluso nella risposta dopo una piccola modifica. presence: truela convalida non è obbligatoria, quindi ho escluso quella parte.
Kirti Thorat

1
Paperclip genererà anche "Errore di convalida richiesto mancante" in caso di caricamento di file PDF. La soluzione è: prima installa "GhostScript" e poi aggiungi "application / pdf" al tipo di contenuto.
HackerKarma

Non lo consiglierei davvero do_not_validate_attachment_file_type . Come afferma Rdocs: grazie a un rapporto di Egor Homakov abbiamo preso provvedimenti per impedire alle persone di falsificare i tipi di contenuto e ottenere dati che non ti aspettavi sul tuo server.
user1322092

3
La mia pazza ragione per non eseguire la convalida del contenuto è perché l'allegato non è stato creato dagli utenti ma da un processo di sistema. Paperclip è il livello di convenienza per l'archiviazione S3.
s01ipsist,


4

È necessario aggiungere validates_attachment_content_type nel modello

Rotaie 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

Rotaie 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
Buono a sapersi, @zire
Arvind singh,

0

Assicurati che il tuo modello di post sia simile a questo ...

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

Non sono riuscito a far funzionare nessuna di queste soluzioni. Ho provato Paperclip 3.1, ma la mia app non ha continuato a dirmi che le mie estensioni dei file di immagine non erano state approvate, anche se erano jpg.

Ho finalmente trovato il successo con la versione 3.5.1.


quindi voglio dire che si può superare questo problema aggiornando la versione
Dharmesh Porwal,

Una specie di. Ho iniziato con l'ultima versione, che in questo momento è 4.2.1. Nessuna fortuna lì, quindi di nuovo nessuna fortuna con 3.1 (che ho trovato suggerito qui). Qualcun altro (non ricordo dove) ha suggerito 3.5.1, e questo ha funzionato per me.
Ric,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.