Page 133 of 165

RVM + naprzemienne korzystanie z 1.8.7 i 1.9.2 – czyli jak stracić 2 godziny z życia

Jeśli chcecie stracić 2 godziny z życia, to mam dla Was świetny sposób. Róbcie migracje pod 1.8.7 a testujcie i odpalajcie serwer pod 1.9.2 ;)

Wczoraj pracowałem nad pewnym kawałkiem kodu, dla którego dużo łatwiej jest robić:

rake db:migrate VERSION=0

niż tworzyć nowe migracje.

Z tego względu, jak nietrudno zauważyć, często zmieniały mi się takie dane jak np hash dla hasła. Nie byłoby w tym nic specjalnego, gdyby nie to, że mam dość mocno "zakorzeniony" w Rubym sposób generowania hasha. Był on zależny od pewnych metod w Rubym, w taki sposób, że po zmanie sposobu obsługi charów i stringów w 1.9.2, także on uległ zmianie. Skutkiem tego było to, że wynikowy hash generowany przez tą samą metodę w drzewie 1.8 i 1.9 różnił się znacząco.

Ta różnica, skutkowała tym, że nie dało się zalogować na konto usera. Oczywiście zanim dotarłem do przyczyny, minęły wyżej wspomniane 2 godziny.

Nie radzę Wam, bawić się jednocześnie 1.8.7 i 1.9.2, a jeśli już musicie i coś przestanie działać, to w pierwszej kolejności odpalcie wszystko tylko pod jedną z tych dwóch wersji.

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.

Copyright © 2024 Closer to Code

Theme by Anders NorenUp ↑