Tag: paperclip

Rails3 + Paperclip + dużo nowych błędów

Dzisiaj przyszło mi się zmierzyć z kolejnymi problemami związanymi z Paperclipem. O ile na 1.8.7 i R3 działał, o tyle na 1.9.2 - przestał. Nie wiem czym to idzie, ale czuję że ten plugin żyje czasem swoim własnym życiem.

Sypie między innymi takimi błędami jak:

  • Paperclip::NotIdentifiedByImageMagickError
  • can't convert nil into Integer
  • is not recognized by the 'identify' command

Trzeba coś było z tym zrobić. Po kilku godzinach poszukiwań i eksperymentów udało się! Paperclip wkońcu działa na Railsach 3.0.0 i Rubym 1.9.2-p0. Jak powtórzyć mój sukces? Pierwszą rzeczą jaką musimy zrobić, jest ściągnięcie wersji 2.3.1. Robimy to klonując repozytorium z gita:

git clone git://github.com/thoughtbot/paperclip.git

a następnie zmieniamy tag:

cd paperclip
git checkout v2.3.1

Jest to ostatnia wersja korzystająca ze "starego" procesora. Paradoksalnie, to nowe powinny działać, jednak w moim wypadku stare okazuje się dużo lepsze. Nowsze wersje także działały ale "po części". Przede wszystkim, niezgodne i18n w moim wypadku. Musiałbym je troszkę poprawiać aby internacjonalizacja Paperclipa działała. Po drugie jeśli ładowaliśmy nieprawidłowy format pliku, to owszem, wyłapywało błąd, jednak zgłaszało także błędy identify.

Wróćmy jednak do właściwego tematu. Co zrobić aby Paperclip zaczął działać? Mając już cały plugin w vendor/plugins/ otwieramy plik lib/paperclip/attachment.rb i zmieniamy następującą linijkę (okolice 45-46 linijki):

# lib/paperclip/attachment.rb
instance.run_callbacks(which, @queued_for_write) {|result, obj| false } # commented to make it work with rails 3 & ruby 1.9 {|result, obj| result == false }

na:

instance.run_callbacks(which, @queued_for_write) # commented to make it work with rails 3 & ruby 1.9 {|result, obj| result == false }

Następnie bierzemy się za plik lib/paperclip/processor.rb i zmieniamy:

# lib/paperclip/processor.rb
sprintf("%s,%d,%d%s", File.basename(basename, extension), $$, n, extension)

na:

sprintf("%s,%d,%s%s", File.basename(basename, extension), $$, n, extension)

Te linijki wyglądają PRAWIE identycznie, więc nie radzę się pomylić ;)

Od teraz mamy działającego ładnie i bezproblemowo Paperclipa.

Rails 3 + Paperclip + Errors, Errors, Errors ;)

Testując dzisiaj paperclipa, okazało się że mimo tego że na gicie jest branch dla Rails3, to niestety nie działa on zbyt dobrze.

Wprawdzie działa on przyzwoicie jeśli przesyłamy poprawne pliki (typ, rozmiar), jednak gdy zaczynamy "się bawić", Paperclip sypie m.in. takimi błędami:

can't convert nil into Integer
An error was received while processing: #<Paperclip::NotIdentifiedByImageMagickError
 #<Paperclip::NotIdentifiedByImageMagickError: /tmp/stream,9641,0.zip is not recognized by the 'identify' command.>

Rozwiązaniem tego problemu jest zainstalowanie Paperclipa jako pluginu, nie jako gema. Wiem że nie jest to ani zbyt eleganckie ani zgodne z drogą obraną przez Rails3, jednak póki co ważniejsze jest że działa ;)

Ważne!
Nowe wersje z branchu Rails3, jak i z branchu dla Rails2, nie działają! Jeśli chcesz odpalić Paperclipa w Rails3 - pobierz wersję 2.2.9.1. Następnie podmień w pliku paperclip.rb RAILS_ROOT na Rails.root.

Ważniejsze!
Nowe wersje z mastera działają na Rails3 bez zarzutu (ale niestety nie na każdym systemie - nie mam pojęcia od czego to zależy).

Copyright © 2025 Closer to Code

Theme by Anders NorenUp ↑