wtorek, 20 grudnia 2011

Ruby on Rails i generatory

Wile E. on Rails
Najpierw nie wiedziałem, o czym napisać w kolejnym wpisie, a potem nie mogłem się zebrać, żeby kontynuować projekt. Wciąż mam to uczucie, że przecież nie znam dobrze sposobu tworzenia aplikacji od podstaw tutaj, więc chwilę się motałem w kwestii tego, od czego właściwie zacząć. Na szczęście w ostatnich dniach mnie natchnęło i postanowiłem opisać część tego, co już mam.

Jako, że miałem już z Railsami do czynienia, to miałem okazję poznać kilka ciekawych aspektów tego frameworka, w tym sposób wygodnego tworzenia modeli, kontrolerów i widoków. Jednak kiedy chciałem się zabrać za to miałem dylemat - czy jest sens, abym tworzył każdy model ręcznie, czy też przy użyciu generatora modeli, ze wszystkimi polami, jakie powinien on posiadać, skoro mam już zdefiniowaną strukturę bazy danych? Zacząłem więc szukać informacji na temat tego, czy jest jakiś generalny sposób na stworzenie wszystkich modeli na podstawie posiadanej bazy danych. Znalazłem informację o czymś, co nazwane było magic_model_generator, ale od którejś kolejnej wersji Rails już nie działało ponoć.

Szablon projektu
I tutaj pasuje wspomnieć, że pierwotnie chciałem korzystać ze środowiska Aptana RadRails, opartego na Eclipse, z którego korzystałem przy pracy z jednym projektem w Railsach. Jednak ogarnianie wtyczki do obsługi Gita tutaj nasunęło mi myśl, żeby sprawdzić, czy czasem NetBeans nie ma wtyczki do obsługi Ruby on Rails. Dlaczego NetBeans? Spodobało mi się korzystanie z tego IDE przy tworzeniu strony Mistrzostw Polski w penspinningu. Poza miłymi odczuciami po samym środowisku wtyczka do obsługi Gita tutaj bardzo fajnie działa, fajnie wygląda porównywanie różnych wersji plików, więc uznałem, że po co mam korzystać z osobnego środowiska specjalnie do RoRa. Okazało się, że jest wtyczka, która dodaje obsługę Railsów do NB i znalazłem pozytywne opinie związane z obsługą RoR tutaj, więc wybór ostateczny był prosty - projekt powstaje przy użyciu NetBeans.

It's a kind of magic
Żeby się już znacznie nie rozpisywać przejdę do rzeczy. Oba wspomniane środowiska ogsługują railsowe generatory, z których część jest domyślnie instalowana - np. generatory modeli, kontrolerów, migracji, czy scaffolding, o którym wspomnę za chwilę. W NB dostęp do generatorów można uzyskać klikając po prostu prawym przyciskiem na projekcie i wybierając z menu opcję "Generate...". Jakoś z ciekawości kliknąłem ostatnio "Install generators" w okienku z wyborem typu generatora i okazało się, że mogę sobie zainstalować wspomniany wcześniej magic_model_generator. I, jak się po chwili okazało, zadziałał wbrew temu co gdzieś wyczytałem. Nie trzeba wpisywać żadnych dodatkowych argumentów - wystarczy, że w pliku database.yml jest zdefiniowane poprawne połączenie do istniejącej bazy danych, a naciśnięcie OK rozpocznie generowanie.

Magicznie wygenerowany model
Po zakończeniu tej operacji katalog z modelami zapełnił się plikami klas, które są mapowane na odpowiednie tabele w bazie danych. Są to jedyne pliki, jakie zostały obecnie utworzone, więc o tym, czy działa to, co się w tych plikach znajduje nie ma się jeszcze za bardzo jak przekonać. A całą treścią tych plików jest obecnie walidacja dodana przez magic_model_generator na podstawie ograniczeń narzuconych na odpowiednie kolumny w tabelach. W logu można zobaczyć, że poza samymi ograniczeniami kolumn generator znalazł także wszystkie zdefiniowane relacje między tabelami i dodał je, co pozwoli na tworzenie wygodnych połączeń między modelami. Tak więc teraz pasuje dorobić do tych modeli kontrolery i widoki, żeby można to było w ogóle zobaczyć.

Prosty scaffolding
Aby uniknąć kopiowania i wklejania jakiejś wstępnej treści kontrolerów oraz widoków postanowiłem skorzystać z generatora, który nazywa się po prostu scaffold i oczywiście jest domyślnie dostępny. Ja chciałem sobie dorobić do istniejących modeli jedynie kontrolery i widoki i nie chciałem wypisywać wszystkich kolumn tutaj, więc ważne dla mnie było, aby generator pomijał tworzenie plików, które już istnieją. Dzięki temu nie zostały nadpisane moje modele z dodaną już walidacją, a sposób rozmieszczenia odpowiednich kontrolek związanych z wprowadzaniem/wyświetlaniem wartości konkretnych pól dorobię ręcznie w sposób, jaki uznam za najlepszy po przemyśleniu tego, przez co nie potrzebowałem podawać tutaj niczego poza nazwą modelu. Istotne jest to, że generator zakłada, że dla modelu o nazwie User tabela w bazie nazywa się Users, dla Category nazywa się Categories itd. Ja jakoś tym razem nazwałem tabele w liczbie pojedynczej nie wiem czemu i potem to zmieniałem, kiedy kontrolery nie mogły znaleźć odpowiedniej tabeli.

Ogólnie scaffolding wygenerował dla modelu user taką strukturę plików:
app/controllers/users_controller.rb
app/helpers/users_helper.rb
app/views/layouts/users.html.erb
app/views/users/edit.html.erb
app/views/users/new.html.erb
app/views/users/show.html.erb
app/views/users/index.html.erb
db/migrate/20111219112001_create_users.rb
public/stylesheets/scaffold.css
test/pliki do testów
Wygenerowany widok users/index
Oczywiście dla każdego innego modelu powstały analogiczne pliki. Poza tym do pliku config/routes.rb zostało dopisane mapowanie pozwalające dostać się do konkretnych części aplikacji w wygodny sposób przez wpisanie np. localhost:3000/users czy /tutorials. Ze względu na to, że przy scaffoldingu nie podałem żadnych argumentów w wytworzonych kontrolerach nie ma żadnych elementów interfejsu, które wyświetlają dane z konkretnych pól, lub pozwalają na ich wpisywanie. Ale o tym zapewne następnym razem.

To tyle na teraz. Pliki migracji są mi absolutnie zbędne w obecnej sytuacji, ponieważ ja już te tabele powiązane z modelami mam, więc o migracjach wspomnę innym razem, kiedy już mi się przydadzą. O layoutach również innym razem, bo już za dużo tekstu tutaj jest. Mam ambitny plan skończyć wstępną wersję aplikacji jeszcze w tym tygodniu, więc będzie kilka nowych wpisów w najbliższym czasie.

Brak komentarzy:

Prześlij komentarz