Paperclip :: Erreurs :: MissingRequiredValidatorError avec Rails 4

226

Je reçois cette erreur lorsque j'essaie de télécharger à l'aide d'un trombone avec mon application de blog de rails. Je ne sais pas à quoi il fait référence quand il dit "MissingRequiredValidatorError". Je pensais qu'en mettant à jour post_params et en lui donnant: image, ce serait bien, car à la fois créer et mettre à jour utiliser post_params

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

Extracted source (around line #30):

def create
  @post = Post.new(post_params)

Ceci est mon 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    

et c'est mon aide de poste

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

Veuillez me faire savoir si je peux compléter du matériel supplémentaire pour vous aider.

Nadia
la source

Réponses:

501

À partir de Paperclip version 4.0, toutes les pièces jointes doivent inclure une validation content_type , une validation file_name , ou déclarer explicitement qu'elles n'en auront pas non plus.

Un trombone déclenche une Paperclip::Errors::MissingRequiredValidatorErrorerreur si vous ne faites rien de tout cela.

Dans votre cas, vous pouvez ajouter l'une des lignes suivantes à votre Postmodèle, après avoir spécifiéhas_attached_file :image

Option 1: valider le type de contenu

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

-OU- une autre façon

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

-OU- encore une autre façon

consiste à utiliser l' expression régulière pour valider le type de contenu.

Par exemple: pour valider tous les formats d'image, l'expression d'expression régulière peut être spécifiée comme indiqué dans

@ LucasCaton's answer

Option 2: valider le nom de fichier

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

Option 3: ne pas valider

Si pour une raison folle (peut être valide mais je ne peux pas y penser pour le moment), vous ne souhaitez pas ajouter de content_typevalidation et permettre aux gens d'usurper des types de contenu et de recevoir des données que vous n'attendiez pas sur votre serveur, puis ajoutez ce qui suit :

do_not_validate_attachment_file_type :image

Remarque:

Spécifiez les types MIME selon vos besoins dans content_type/ matchesoptions ci-dessus. Je viens de vous donner quelques types d'images MIME pour commencer.

Référence:

Reportez-vous à Paperclip: Validations de sécurité , si vous devez encore vérifier. :)

Vous devrez peut-être également gérer la validation de l'usurpation d'identité expliquée ici https://stackoverflow.com/a/23846121

Kirti Thorat
la source
3
Les validateurs peuvent également être définis en utilisant le nouveau style d'aide, par exemple. validates_attachment :image, presence: true, content_type: { content_type: ["image/jpg", "image/jpeg", "image/png"] }
rawonstack
@rawonstack +1 Merci d'avoir suggéré l'alternative. :) J'ai inclus cela en réponse après un petit ajustement. presence: truela validation n'est pas obligatoire, j'ai donc exclu cette partie.
Kirti Thorat
1
Paperclip lancera également "Erreur de validateur requise manquante" en cas de téléchargement de fichier PDF. La solution de contournement est la suivante: installez d'abord le "GhostScript" puis ajoutez "application / pdf" au type de contenu.
HackerKarma
Je ne recommanderais vraiment pas do_not_validate_attachment_file_type . Comme le dit Rdocs: grâce à un rapport d'Egor Homakov, nous avons pris des mesures pour empêcher les gens d'usurper les types de contenu et d'obtenir des données que vous n'attendiez pas sur votre serveur.
user1322092
3
Ma raison folle de ne pas faire de validation de contenu est que la pièce jointe n'est pas créée par les utilisateurs mais par un processus système. Le trombone est la couche pratique pour le stockage S3.
s01ipsist
4

Besoin d'ajouter validates_attachment_content_type dans le modèle

Rails 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

Rails 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
la source
1
Bon à savoir @zire
Arvind singh
0

Assurez-vous que votre modèle de poste ressemble à ceci ...

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
la source
-1

Je n'ai pas réussi non plus à faire fonctionner ces solutions. J'ai essayé Paperclip 3.1, mais mon application n'a pas pu continuer à me dire que mes extensions de fichier image n'étaient pas approuvées, même si elles étaient au format jpg.

J'ai finalement trouvé le succès avec la version 3.5.1.

Ric
la source
alors
je
Sorte de. J'ai commencé avec la dernière version, qui est actuellement la 4.2.1. Pas de chance là-bas, puis encore pas de chance avec 3.1 (que j'ai trouvé suggéré ici). Quelqu'un d'autre (je ne me souviens plus où) a suggéré 3.5.1, et cela a fonctionné pour moi.
Ric