Paperclip :: Errores :: MissingRequiredValidatorError con Rails 4

226

Recibo este error cuando intento subir usando un clip con mi aplicación de blog de rails. No estoy seguro de a qué se refiere cuando dice "MissingRequiredValidatorError" Pensé que actualizando post_params y dándole: imagen estaría bien, ya que tanto crear como actualizar usan post_params

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

Extracted source (around line #30):

def create
  @post = Post.new(post_params)

Este es mi 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    

y este es mi ayudante de publicaciones

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

Avíseme si puedo complementar material adicional para ayudarlo a ayudarme.

nadia
fuente

Respuestas:

501

Comenzando con Paperclip version 4.0, todos los archivos adjuntos deben incluir una validación de tipo de contenido , una validación de nombre de archivo o declarar explícitamente que tampoco van a tener.

Paperclip genera un Paperclip::Errors::MissingRequiredValidatorErrorerror si no hace nada de esto.

En su caso, puede agregar cualquiera de las siguientes líneas a su Postmodelo, después de especificarhas_attached_file :image

Opción 1: validar el tipo de contenido

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

-O BIEN- de otra manera

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

O bien, otra forma

es usar expresiones regulares para validar el tipo de contenido.

Por ejemplo: para validar todos los formatos de imagen, la expresión regex se puede especificar como se muestra en

La respuesta de @ LucasCaton

Opción 2: validar nombre de archivo

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

Opción 3: no validar

Si por alguna extraña razón (puede ser válida pero no puedo pensar en una en este momento), no desea agregar ninguna content_typevalidación y permitir que las personas falsifiquen Tipos de contenido y reciban datos que no esperaba en su servidor, luego agregue lo siguiente :

do_not_validate_attachment_file_type :image

Nota:

Especifique los tipos MIME según sus requisitos dentro de content_type/ matchesopciones anteriores. Para empezar, acabo de dar algunos tipos de imágenes MIME.

Referencia:

Consulte Paperclip: Validaciones de seguridad , si aún necesita verificar. :)

Es posible que también deba lidiar con la validación de suplantación de identidad explicada aquí https://stackoverflow.com/a/23846121

Kirti Thorat
fuente
3
Los validadores también se pueden definir utilizando el nuevo estilo auxiliar, por ejemplo. validates_attachment :image, presence: true, content_type: { content_type: ["image/jpg", "image/jpeg", "image/png"] }
rawonstack
@rawonstack +1 Gracias por sugerir la alternativa. :) Lo he incluido en la respuesta después de un pequeño ajuste. presence: truela validación no es obligatoria, por lo que he excluido esa parte.
Kirti Thorat
1
Paperclip también arrojará "Falta el error de validación requerido" en caso de carga de archivos PDF. La solución para eso es: Primero instale el "GhostScript" y luego agregue "application / pdf" al tipo de contenido.
HackerKarma
Realmente no lo recomendaría do_not_validate_attachment_file_type . Como dice Rdocs: gracias a un informe de Egor Homakov, hemos tomado medidas para evitar que las personas falsifiquen Tipos de contenido y obtengan datos que no esperaban en su servidor.
user1322092
3
Mi loca razón para no validar el contenido es porque el archivo adjunto no es creado por los usuarios sino por un proceso del sistema. Paperclip es la capa conveniente para el almacenamiento S3.
s01ipsist 01 de
4

Necesita agregar validates_attachment_content_type en Model

Carriles 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

Carriles 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
fuente
1
Es bueno saber esto @zire
Arvind singh
0

Asegúrese de que su modelo de publicación se vea así ...

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

Tampoco pude lograr que ninguna de estas soluciones funcionara. Intenté Paperclip 3.1, pero mi aplicación no pudo decirme que mis extensiones de archivo de imagen no estaban aprobadas, a pesar de que eran jpg.

Finalmente encontré el éxito con la versión 3.5.1.

Ric
fuente
así que quiero decir que uno puede superar este problema actualizando la versión
Dharmesh Porwal
Algo así como. Comencé con la última versión, que ahora es 4.2.1. No hubo suerte allí, entonces nuevamente no hubo suerte con 3.1 (que encontré sugerido aquí). Alguien en otro lugar (no recuerdo dónde) sugirió 3.5.1, y eso funcionó para mí.
Ric