Скріпка :: Помилки :: MissingRequiredValidatorError з Rails 4


226

Я отримую цю помилку, коли намагаюся завантажувати скріпки з моїм додатком для ведення блогів на рейках. Не впевнений, на що йдеться, коли йдеться про "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)

Це мій 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

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

Відповіді:


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"] }

- Або іншим способом

полягає у використанні регулярного вираження для перевірки типу вмісту.

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

@ Відповідь Лукаса Катона

Варіант 2: Перевірка імені файлу

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

Варіант 3: Не підтверджуйте

Якщо з якихось божевільних причин (може бути дійсним, але я не можу придумати про це зараз), ви не бажаєте додавати content_typeперевірку та дозволяти людям підробляти типи вмісту та отримувати дані, яких ви не очікували, на свій сервер, тоді додайте наступне :

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
singh

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

-1

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

Нарешті я знайшов успіх у версії 3.5.1.


тож хочу сказати, що можна подолати цю проблему, оновивши версію
Dharmesh Porwal

Різновид. Я почав з останньої версії, яка зараз є 4.2.1. Немає удачі там, потім знову не щастить з 3.1 (що я знайшов тут запропонованим). Хтось десь (не можу згадати, де) запропонував 3.5.1, і це працювало на мене.
Рік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.