Gdańskie szkolenie z RoR wyszło całkiem, całkiem :), ale dla mnie chyba najważniejsze są wyciągnięte wnioski na przyszłość: pamiętać by zacząć od ‘bloga w 15 minut‘ i nie przeginać z linijkami typu:
# Zmiana stringa zawierającego nazwę klasy typu jednostki na klasę np. UnitDetail::Hufiec
def more_detail
self.unit_detail.unit_type.constantize.find_by_unit_id(self.id)
end
kiedy szkoli się niedoświadczonych :) (wcześniejsza wersja była z eval’em ;) ).
Zdjęcia oczywiście są od jakiegoś czasu w galerii.
Problem rysuje się następująco: istnieje model Unit zawierający spis jednostek (według plugin’u acts_as_tree) a chcemy uzyskać z niego tablicę obiektów Hash (zagnieżdżających się w sobie) a później zamienić w strukturę danych JSON. Niestety nie istnieje metoda to_json_via_hash_and_array ;). Można poradzić sobie z tym sięgając po rekurencję.
Funkcja transformująca w drzewo wygląda następująco:
# Tworzymy po kolei elementy tablicy zawierające hash w którym /jeśli istnieją potomne jednostki/ tworzone są kolejne tablice z hash'ami
def tree(roots)
tab = Array.new
roots.each do |root|
hash = {}
hash[:id] = root.id
hash[:txt] = root.name
children = root.children
if children.length > 0
hash[:items] = tree(children)
end
tab << hash
end
tab
end
A jej użycie jest już banalne:
# Ciekawe czy można krócej?
units = {}
units = tree(Unit.find(:all, :conditions => [ "parent_id = 0" ]))
Mając już tą upragnioną tablicę można przerobić ją na JSON:
# Niespodzianka ;)
units.to_json
Ale po co to wszystko? :), aby w widoku wrzucić do biblioteki JavaScriptowej która przerabia takie struktury danych na piękne rozwijane drzewa.
Wczoraj pracowałem nad generowaniem pdf’ów w Railsach (Prawn & Prawnto) – generalnie bardzo fajna sprawa jednak trzeba uważać przy stosowaniu metody group na bounding_box’ach (nieumiejętnie stosowana rozwali wam powtarzającą się tabelkę przez kilka stron)… ale nie o tym chciałem pisać :).
Wpis ten ma na celu podzielenie się problemem w którego się wczoraj bardzo wkręciłem, a wyglądał on następująco:
Mamy tabelę której kolumny nie rozszerzają się gdy ich zawartość rośnie (w x-ach) – można przyjąć że jest ona stałym tłem, a my chcemy by tekst który w nią wrzucamy zawsze się zmieścił (w problematycznych przypadkach przechodził do nowej linii – w tym konkretnym: były to jednowyrazowe nazwy jednostek miary na fakturze).
Rozwiązanie wygląda tak (zmienną zastąpiłem tekstem by łatwiej było wkleić do konsoli Railsów):
(najpierw string dzielony jest na tablicę znaków, następnie zamieniany na tablicę składającą się z tablic cztero-elementowych, później każda z nich zamieniana jest na string a stringi są łączone myślnikiem i znakiem nowej linii :) ).
Ciekawe czy da się to zrobić szybciej/lepiej i jak by to zrobił jakiś guru od PHP ;) (jakiegoś frameworka PHP).
Czyli jak to na prawdę było :), szybki pokaz zdjęć z Poznańskiej akcji instalacji wymarzonego serwera HP dla ZHR.pl (maszyna to HP ProLiant DL380 G6 z dwoma Quad-Core Intel Nehalem obsługującymi Hyper-Threading – to tak jak byśmy mieli 16 procesorów :), czterema dyskami SAS 450 GB 15000 obr., dwoma 1000 GB do backupów, możliwością wpięcia ponad 190 GB RAM… wymieniać mógłbym długo. System na który postawiliśmy to OpenSolaris (z mojej perspektywy to najlepszy wybór ze względu na ZFS i Zony.
Pod adresem http://przymusiala.net/galeria/v/2009/metodyczne/ znajdują się zdjęcia z jednodniowej wyprawy do Zgrupowania Łódzkich Kursów Metodycznych i Instruktorskich w Gostyninie. Zdjęcia ważne szczególnie dla uczestniczek i uczestników – zapraszam!
Wróciłem dziś (między 5 a 6 rano) do Łodzi z obozu (dość niestandardowego :) : 50 kobiet + 2 mężczyzn będących na stanie zgrupowania, obóz był wędrowny mimo iż uczestniczą w nim drużyny młodszoharcerskie).
Kilka dni temu podczas zmiany grafiki i silnika na przymusiala.net musiałem się zmierzyć z problemem uruchomienia starych skryptów php (blog, galeria, wiki…) wewnątrz nowej aplikacji RoR. Próbowałem wielu sposobów z symlinkami i plikami .htaccess jednak okazało się że mod_rails (Passenger) nadpisuje wszystkie dyrektywy pliku htaccess! (jest jedna instrukcja która to wyłącza jednak wtedy nic już nie działa ;) ).