Büroklammer :: Fehler :: MissingRequiredValidatorError with Rails 4

226

Ich erhalte diesen Fehler, wenn ich versuche, mit meiner Rails-Blogging-App eine Büroklammer hochzuladen. Ich bin mir nicht sicher, worauf es sich bezieht, wenn "MissingRequiredValidatorError" steht. Ich dachte, dass es in Ordnung wäre, post_params zu aktualisieren und es zu geben: image, da sowohl create als auch update post_params verwenden

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

Extracted source (around line #30):

def create
  @post = Post.new(post_params)

Dies ist meine 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    

und das ist mein Beitragshelfer

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

Bitte lassen Sie mich wissen, ob ich zusätzliches Material ergänzen kann, damit Sie mir helfen können.

Nadia
quelle

Antworten:

501

Beginnend mit Paperclip version 4.0, werden alle Anlagen erforderlich , um eine umfassen content_type Validierung , eine datei_name Validierung , oder explizit fest , dass sie gehen , um entweder nicht zu haben.

Büroklammer löst Paperclip::Errors::MissingRequiredValidatorErrorFehler aus, wenn Sie dies nicht tun.

In Ihrem Fall können Sie Ihrem PostModell nach der Angabe eine der folgenden Zeilen hinzufügenhas_attached_file :image

Option 1: Überprüfen Sie den Inhaltstyp

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

-Oder- ein anderer Weg

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

-OR- noch ein anderer Weg

ist die Verwendung von Regex zur Überprüfung des Inhaltstyps.

Beispiel: Um alle Bildformate zu überprüfen, kann der Regex-Ausdruck wie in angegeben angegeben werden

@ LucasCatons Antwort

Option 2: Dateinamen überprüfen

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

Option 3: Nicht validieren

Wenn Sie aus irgendeinem verrückten Grund (kann gültig sein, aber ich kann mir momentan keinen content_typevorstellen) keine Validierung hinzufügen und den Nutzern erlauben, Inhaltstypen zu fälschen und Daten zu empfangen, die Sie nicht auf Ihrem Server erwartet hatten, fügen Sie Folgendes hinzu ::

do_not_validate_attachment_file_type :image

Hinweis:

Geben Sie die MIME-Typen gemäß Ihren Anforderungen unter content_type/ matchesoptions oben an. Ich habe gerade ein paar Bild-MIME-Typen angegeben, mit denen Sie beginnen sollen.

Referenz:

Informationen zur Überprüfung finden Sie unter Büroklammer: Sicherheitsüberprüfungen . :) :)

Möglicherweise müssen Sie sich auch mit der hier erläuterten Spoofing-Validierung befassen: https://stackoverflow.com/a/23846121

Kirti Thorat
quelle
3
Validatoren können auch mit dem neuen Hilfsstil definiert werden, z. validates_attachment :image, presence: true, content_type: { content_type: ["image/jpg", "image/jpeg", "image/png"] }
Rawonstack
@rawonstack +1 Danke, dass du die Alternative vorgeschlagen hast. :) Ich habe das nach einer kleinen Änderung in die Antwort aufgenommen. presence: trueDie Validierung ist nicht obligatorisch, daher habe ich diesen Teil ausgeschlossen.
Kirti Thorat
1
Die Büroklammer gibt auch beim Hochladen der PDF-Datei den Fehler "Fehlender erforderlicher Validierungsfehler" aus. Die Problemumgehung dafür ist: Installieren Sie zuerst "GhostScript" und fügen Sie dann "application / pdf" zum Inhaltstyp hinzu.
HackerKarma
Ich würde es wirklich nicht empfehlen do_not_validate_attachment_file_type . Wie Rdocs es ausdrückt: Dank eines Berichts von Egor Homakov haben wir Schritte unternommen, um zu verhindern, dass Personen Inhaltstypen fälschen und Daten, die Sie nicht erwartet hatten, auf Ihren Server übertragen.
user1322092
3
Mein verrückter Grund, keine Inhaltsüberprüfung durchzuführen, ist, dass der Anhang nicht von den Benutzern, sondern von einem Systemprozess erstellt wird. Büroklammer ist die Komfortschicht für die S3-Aufbewahrung.
s01ipsist
20

Geben Sie einfach Ihr Modell ein:

validates_attachment :image, content_type: { content_type: /\Aimage\/.*\Z/ }

https://github.com/thoughtbot/paperclip

Lucas Caton
quelle
4

Sie müssen validates_attachment_content_type in Model hinzufügen

Schienen 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

Schienen 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
quelle
1
Gut zu wissen, dass @zire
Arvind singh
0

Stellen Sie sicher, dass Ihr Postmodell so aussieht ...

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
quelle
-1

Ich konnte auch keine dieser Lösungen zum Laufen bringen. Ich habe Paperclip 3.1 ausprobiert, konnte mir aber nicht sagen, dass meine App-Dateierweiterungen nicht genehmigt wurden, obwohl sie jpg waren.

Ich habe endlich Erfolg mit Version 3.5.1 gefunden.

Ric
quelle
Ich
Art von. Ich habe mit der neuesten Version begonnen, die momentan 4.2.1 ist. Kein Glück dort, dann wieder kein Glück mit 3.1 (was ich hier vorgeschlagen fand). Jemand anders (ich kann mich nicht erinnern, wo) hat 3.5.1 vorgeschlagen, und das hat bei mir funktioniert.
Ric