Paperclip :: Erros :: MissingRequiredValidatorError com Rails 4

226

Estou recebendo esse erro ao tentar fazer upload usando um clipe de papel com meu aplicativo de blog do Rails. Não tenho certeza do que está se referindo quando diz "MissingRequiredValidatorError" Eu pensei que, atualizando post_params e fornecendo: image, seria bom, pois tanto a criação quanto a atualização usam post_params

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

Extracted source (around line #30):

def create
  @post = Post.new(post_params)

Este é o meu 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 este é meu ajudante de posts

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

Informe-me se posso suplementar material extra para ajudá-lo.

Nadia
fonte

Respostas:

501

Começando com Paperclip version 4.0, todos os anexos devem incluir uma validação content_type , uma validação file_name ou declarar explicitamente que eles também não terão.

O clipe de papel gera Paperclip::Errors::MissingRequiredValidatorErrorerro se você não fizer nada disso.

No seu caso, você pode adicionar qualquer uma das seguintes linhas ao seu Postmodelo, depois de especificarhas_attached_file :image

Opção 1: Validar tipo de conteúdo

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

-OU- outra maneira

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

-OU- mais uma maneira

é usar regex para validar o tipo de conteúdo.

Por exemplo: Para validar todos os formatos de imagem, a expressão regex pode ser especificada conforme mostrado em

@ Resposta de LucasCaton

Opção 2: Validar nome do arquivo

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

Opção 3: não validar

Se, por algum motivo maluco (pode ser válido, mas não consigo pensar em um agora), você não deseja adicionar nenhuma content_typevalidação e permitir que as pessoas falsifiquem os Tipos de Conteúdo e recebam dados que você não esperava no servidor, adicione o seguinte :

do_not_validate_attachment_file_type :image

Nota:

Especifique os tipos MIME conforme sua exigência em content_type/ matchesoptions acima. Acabei de fornecer alguns tipos MIME de imagem para você começar.

Referência:

Consulte Clipe de papel: Validações de segurança , se você ainda precisar verificar. :)

Talvez você também precise lidar com a validação de falsificação explicada aqui https://stackoverflow.com/a/23846121

Kirti Thorat
fonte
3
Os validadores também podem ser definidos usando o novo estilo auxiliar, por exemplo. validates_attachment :image, presence: true, content_type: { content_type: ["image/jpg", "image/jpeg", "image/png"] }
rawonstack
@rawonstack +1 Obrigado por sugerir a alternativa. :) Incluí isso na resposta depois de um pequeno ajuste. presence: truevalidação não é obrigatória, por isso excluí essa parte.
Kirti Thorat
1
O clipe de papel também exibirá "Erro de validador obrigatório ausente" no caso de upload de arquivo PDF. A solução alternativa para isso é: primeiro instale o "GhostScript" e adicione "application / pdf" ao tipo de conteúdo.
HackerKarma
Eu realmente não recomendaria do_not_validate_attachment_file_type . Como Rdocs coloca: Graças a um relatório de Egor Homakov, tomamos medidas para impedir que as pessoas falsifiquem tipos de conteúdo e obtenham dados que você não esperava no servidor.
precisa saber é o seguinte
3
Minha louca razão para não fazer a validação de conteúdo é porque o anexo não é criado pelos usuários, mas por um processo do sistema. O clipe de papel é a camada de conveniência para o armazenamento S3.
S01ipsist #
4

É necessário adicionar validates_attachment_content_type no modelo

Trilhos 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

Trilhos 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
fonte
1
É bom saber isso @zire
Arvind Singh
0

Verifique se o seu modelo de postagem fica assim ...

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

Também não consegui que nenhuma dessas soluções funcionasse. Tentei o Paperclip 3.1, mas meu aplicativo não podia continuar dizendo que minhas extensões de arquivo de imagem não eram aprovadas, mesmo sendo jpg.

Finalmente encontrei sucesso com a versão 3.5.1.

Ric
fonte
então, quero dizer que é possível superar esse problema atualizando a versão
Dharmesh Porwal
Tipo de. Comecei com a versão mais recente, que agora é 4.2.1. Sem sorte lá, então novamente sem sorte com 3.1 (o que eu achei sugerido aqui). Alguém em outro lugar (não me lembro onde) sugeriu 3.5.1, e isso funcionou para mim.
Ric