Paperclip :: Errors :: MissingRequiredValidatorError with Rails 4


226

Ten błąd pojawia się, gdy próbuję przesłać za pomocą spinacza do papieru z moją aplikacją do blogowania w Railsach. Nie jestem pewien, do czego się odnosi, gdy mówi „MissingRequiredValidatorError”. Pomyślałem, że aktualizując post_params i podając mu: image będzie dobrze, ponieważ zarówno tworzenie, jak i aktualizacja używają post_params

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

Extracted source (around line #30):

def create
  @post = Post.new(post_params)

To jest mój 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    

i to jest mój pomocnik postów

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

Daj mi znać, czy mogę uzupełnić dodatkowe materiały, które pomogą mi pomóc.

Odpowiedzi:


501

Zaczynając od Paperclip version 4.0, wszystkie załączniki muszą zawierać sprawdzanie poprawności typu treści , sprawdzanie poprawności nazwy pliku lub jawne stwierdzenie, że nie będzie.

Spinacz podnosi Paperclip::Errors::MissingRequiredValidatorErrorbłąd, jeśli nie zrobisz tego.

W twoim przypadku możesz dodać dowolną z poniższych linii do swojego Postmodelu, po określeniuhas_attached_file :image

Opcja 1: Sprawdź poprawność typu zawartości

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

-LUB- inny sposób

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

-LUB- jeszcze inny sposób

jest użycie wyrażenia regularnego do sprawdzania poprawności typu zawartości.

Na przykład: Aby sprawdzić poprawność wszystkich formatów obrazów, można określić wyrażenie regularne, jak pokazano w

Odpowiedź LucasCatona

Opcja 2: Sprawdź poprawność nazwy pliku

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

Opcja 3: Nie sprawdzaj poprawności

Jeśli z jakiegoś szalonego powodu (może być poprawny, ale nie mogę teraz o tym pomyśleć), nie chcesz dodawać żadnych content_typesprawdzeń poprawności i zezwalać ludziom na fałszowanie typów treści i otrzymywanie danych, których nie spodziewałeś się na twoim serwerze, a następnie dodaj następujące :

do_not_validate_attachment_file_type :image

Uwaga:

Określ typy MIME zgodnie z wymaganiami w content_type/ matchesopcjach powyżej. Właśnie podałem kilka typów obrazków MIME, od których możesz zacząć.

Odniesienie:

Zobacz Paperclip: Security Validations , jeśli nadal musisz zweryfikować. :)

Być może będziesz musiał poradzić sobie z wyjaśnieniem fałszowania wyjaśnionym tutaj https://stackoverflow.com/a/23846121


3
Walidatory można również zdefiniować przy użyciu nowego stylu pomocnika, np. validates_attachment :image, presence: true, content_type: { content_type: ["image/jpg", "image/jpeg", "image/png"] }
— rawonstack

@rawonstack +1 Dziękujemy za zasugerowanie alternatywy. :) Uwzględniłem to w odpowiedzi po drobnej poprawce. presence: truewalidacja nie jest obowiązkowa, więc wykluczyłem tę część.
— Kirti Thorat

1
Spinacz zwróci również „Brak wymaganego błędu walidatora” w przypadku przesłania pliku PDF. Obejściem tego jest: Najpierw zainstaluj „GhostScript”, a następnie dodaj „application / pdf” do typu zawartości.
— HackerKarma

Naprawdę nie polecałbym do_not_validate_attachment_file_type . Jak ujął to Rdocs: Dzięki raportowi Egora Homakova podjęliśmy kroki, aby zapobiec fałszowaniu typów treści i uzyskiwaniu danych, których nie spodziewałeś się na twoim serwerze.
— user1322092,

3
Moim szalonym powodem do nie sprawdzania poprawności treści jest to, że załącznik nie jest tworzony przez użytkowników, ale przez proces systemowy. Spinacz do papieru to wygodna warstwa do przechowywania S3.
— s01ipsist


4

Konieczne jest dodanie typu validates_attachment_content_content w modelu

Szyny 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

Szyny 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
Dobrze wiedzieć to @zire
— Arvind singh

0

Upewnij się, że Twój model postu wygląda tak ...

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

Nie mogłem też uruchomić żadnego z tych rozwiązań. Próbowałem Paperclip 3.1, ale nie mogłem wtedy powiedzieć, że moje rozszerzenia plików graficznych nie zostały zatwierdzone, nawet jeśli były w formacie jpg.

W końcu znalazłem sukces z wersją 3.5.1.


więc chcę powiedzieć, że można rozwiązać ten problem, aktualizując wersję
— Dharmesh Porwal

Raczej. Zacząłem od najnowszej wersji, która w tej chwili to 4.2.1. Nie ma szczęścia, potem znowu nie ma szczęścia z wersją 3.1 (którą znalazłem tutaj sugerowaną). Ktoś gdzie indziej (nie pamiętam gdzie) zasugerował 3.5.1 i to zadziałało dla mnie.
— Ric
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.