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

191

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

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

Extracted source (around line #30):

def create
  @post = Post.new(post_params)

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

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

Теги:
ruby-on-rails-4
paperclip

5 ответов

478
Лучший ответ

Начиная с 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"]

-OR- другой способ

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

-OR- еще один способ

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

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

@LucasCaton 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/questions/23845902/uploading-files-to-rails-4-0-with-paperclip-and-simple-form

  • 3
    Валидаторы также могут быть определены с использованием нового вспомогательного стиля, например. validates_attachment :image, presence: true, content_type: { content_type: ["image/jpg", "image/jpeg", "image/png"] }
  • 0
    @rawonstack +1 Спасибо за предложение альтернативы. :) Я включил это в ответ после небольшой настройки. presence: true проверка не обязательна, поэтому я исключил эту часть.
Показать ещё 4 комментария
16

Просто введите свою модель:

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

https://github.com/thoughtbot/paperclip

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

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
  • 0
    Rails 4 вариант решит мою проблему. Спасибо Арвинд!
  • 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
-2

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню