Скрепка :: Ошибки :: MissingRequiredValidatorError с Rails 4

226

Я получаю эту ошибку, когда пытаюсь загрузить с помощью скрепки с моим приложением для блогов rails. Не уверен, на что он ссылается, когда говорит «MissingRequiredValidatorError». Я подумал, что, обновив post_params и предоставив его: image, все будет в порядке, так как для создания и обновления используется post_params.

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

Extracted source (around line #30):

def create
  @post = Post.new(post_params)

Это мой 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    

и это мой пост помощник

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

Пожалуйста, дайте мне знать, могу ли я добавить дополнительный материал, чтобы помочь вам помочь мне.

Nadia
источник

Ответы:

501

Начиная с Paperclip version 4.0, все приложения должны включать в себя проверку content_type , валидацию имя_файла , или в явном состоянии , что они не собираются иметь либо.

Скрепка вызывает Paperclip::Errors::MissingRequiredValidatorErrorошибку, если вы ничего не делаете.

В вашем случае, вы можете добавить любого из следующей строки в вашу Postмодель, после того, как указаниеhas_attached_file :image

Вариант 1: проверить тип контента

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

Или другой путь

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

-ИЛИ- еще один способ

использовать регулярные выражения для проверки типа контента.

Например: чтобы проверить все форматы изображений, можно указать выражение регулярного выражения, как показано в

@ LucasCaton's answer

Вариант 2: проверить имя файла

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

Вариант 3: не проверять

Если по какой-то безумной причине (может быть действительной, но я не могу придумать одну из них сейчас), вы не хотите добавлять content_typeпроверку и позволять людям подделывать Content-Types и получать данные, которые вы не ожидали, на свой сервер, затем добавьте следующее :

do_not_validate_attachment_file_type :image

Примечание:

Укажите типы MIME в соответствии с вашими требованиями в content_type/ matchesопции выше. Я только что дал несколько типов изображений MIME для начала.

Ссылка:

Обратитесь к Скрепка: Проверка безопасности , если вам все еще нужно проверить. :)

Возможно, вам также придется иметь дело с проверкой спуфинга, описанной здесь https://stackoverflow.com/a/23846121

Кирти Торат
источник
3
Валидаторы также могут быть определены с использованием нового вспомогательного стиля, например. validates_attachment :image, presence: true, content_type: { content_type: ["image/jpg", "image/jpeg", "image/png"] }
rawonstack
@rawonstack +1 Спасибо за предложение альтернативы. :) Я включил это в ответ после небольшой настройки. presence: trueпроверка не является обязательной, поэтому я исключил эту часть.
Кирти Торат
1
Скрепка также выдаст «Отсутствует требуемая ошибка валидатора» в случае загрузки файла PDF. Обходной путь для этого: сначала установите «GhostScript», а затем добавьте «application / pdf» в тип содержимого.
HackerKarma
Я бы действительно не рекомендовал do_not_validate_attachment_file_type . Как говорит Rdocs: благодаря отчету Егора Хомакова мы предприняли шаги, чтобы предотвратить подделку людьми типов контента и получение данных, которые вы не ожидали, на ваш сервер.
user1322092
3
Моя сумасшедшая причина не выполнять проверку контента в том, что вложение создается не пользователями, а системным процессом. Скрепка - это удобный слой для хранения S3.
s01ipsist
4

Необходимо добавить validates_attachment_content_type в Model

Рельсы 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

Рельсы 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
Хорошо знать это @zire
Арвинд Сингх
0

Убедитесь, что ваша почтовая модель выглядит так ...

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
источник
-1

Я не мог заставить ни одно из этих решений работать. Я попробовал Paperclip 3.1, но не смог тогда, чтобы мое приложение продолжало сообщать мне, что мои расширения файлов изображений не были одобрены, даже если они были в формате jpg.

Я наконец-то добился успеха с версией 3.5.1.

Ric
источник
поэтому хочу сказать, что можно решить эту проблему, обновив версию
Dharmesh Porwal
Вроде, как бы, что-то вроде. Я начал с последней версии, которая сейчас 4.2.1. Не повезло, тогда опять не повезло с 3.1 (который я нашел здесь). Кто-то еще (не помню где) предложил 3.5.1, и это сработало для меня.
Рик,