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.