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.

nadia
źródło

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

Kirti Thorat
źródło
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
Arvind singh
źródło
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
Shriyog
źródło
-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.

Ric
źródło
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