Tutorial 1: RadRails - twoja pierwsza aplikacja

W tym tutorialu dowiesz się jak rozpocząć pracę z programem RadRails. Tutorial ten jest dość szczegółowy, by nawet osoba pierwszy raz stykająca się z tego rodzaju programem nie miała większych problemów ze zrozumieniem.

Program RadRails trzeba poznać swoją drogą, ale to przy okazji. Głównym naszym celem jest napisanie aplikacji. Naszą pierwszą aplikacją webową będzie notes, w którym będziemy zapisywać, edytować i usuwać notki. A pojedyncza notka będzie składać się z tytułu i treści. Proste? To do dzieła!

Krok 1: RadRailsy zainstalowane, pora odpalić aplikację

Przy pierwszym uruchomieniu może się pojawić okienko jak poniżej, pytające o folder, w którym będziemy trzymać nasze projekty. Proponuję zostawić domyślną ścieżkę C:\Rails_project i zaznaczyć checkbox (Use this as the default and do not ask again), by przy kolejnych uruchomieniach nie pytał nas o to.

Po kliknięciu OK, powinien na dysku C: pojawić się katalog Rails_project.

Krok 2: Widzimy okno RadRails

Pojawiło się nam okno RadRails z róznymi panelami. Nie będę w tym kroku omawiał poszczególnych paneli, gdyż wraz z ich używaniem poznamy ich zastosowanie. Standardowe ułożenie paneli pokazano na poniższym rysunku. Do wszystkich paneli możemy także dotrzeć poprzez menu, wybierając Window->Show View a następnie panel, na którym chcemy pracować.

Krok 3: Tworzymy nowy projekt

By uwtorzyć nowy projekt wybierz z menu File->New.... Następnie z rozwijanego drzewa w okienku New wybierz Rails Project. Zamiast szukać możesz także w miejscu do wpisania tekstu wpisać rails - powinna zostać tylko szukana przez nas opcja. 

Na przyszłość, by zaoszczędzić sobie klikania, warto wiedzieć, że ten sam rezultat można uzyskać także w inny sposób, rozwijając listę przy ikonie nowego projektu i wybierając Rails Project.

Krok 4: Pora nazwać projekt

W oknie New Rails project w nazwie projektu (Project name) wpisz projekt1 i naciśnij Finish (projekt zostanie utworzony w domyślnej lokalizacji C:/Rails_project/projekt1).

Krok 5: Panel Rails Navigator

W panelu Rails Navigator (po lewej stronie, jesli go nie widzisz wybierz z menu Window->Show View->Rails Navigator) pojawił się nasz projekt, rozwiń go klikając na nim dwa razy.

Utworzyła nam się cała struktura katalogów, w których pogrupowane będą pliki naszej aplikacji w zależności od ich funkcji. Najważniejsze katalogi przedstawia poniższa tabela:
 

app pliki źródłowe naszej aplikacji
config pliki konfiguracyjne
db pliki związane z bazą danych
lib pliki bibliotek
log pliki logów
public pliki javascript, css, obrazki
vendor pliki pluginów

Krok 6: Uruchomiamy serwer

Przejdź do panelu Servers (kliknij dolny panel - domyślnie pierwsza zakładka albo Window->Show views->Servers). 

Jak widzisz serwer został utworzony, jego Status jednak jest Stopped (serwer jest zatrzymany), należy go zatem uruchomić, do czego służy zielony przycisk z opisem Start. Zaznacz serwer projekt1Serveri kliknij zielony przycisk Start, serwer zacznie się uruchamiać. Może to chwilę potrwać, w tym czasie na dolnym pasku stanu będzie wyświetlany napis Starting server. Po uruchomieniu Status zmieni się na Started.

Krok 7: Localhost i 3000

Teraz chwila prawdy... w dowolnej przeglądarce internetowej wpisz adres: http://localhost:3000/

Powinna się pojawić strona Ruby on Rails: Welcome aboard (czyli po polsku: Witamy na pokładzie). Jeśli nie udało się nawiązać połączenia i strona nie została wyświetlona, sprawdź w zakładce Servers, czy serwer został już uruchomiony (Status: Started), czy port który został wpisany po localhost (u nas 3000) jest zgodny z portem na którym uruchomiliśmy serwer (Port: 3000), jeśli nie, to po localhost wpisz port na którym został uruchomiony serwer. Jeśli i to nie pomogło, przejdź do strony pomocy: Co gdy nie działa localhost?

Krok 8: Tworzymy bazę MySQL dla naszego projektu

Zgodnie z tym, co jest po angielsku napisane na wyświetlonej stronie, na początek utworzymy bazę danych, a następnie zajmiemy się modelami i kontrolerami. Mam nadzieję, że masz zainstalowaną bazę MySQL, jeśli nie, pobierz ją i zainstaluj

Następnie w Windowsach wybierz Start->Uruchom... wpisz w okienku: cmd i kliknij OK. W linii poleceń wpisz: mysql -u root, na początku linii powinien pojawić się napis: mysql>

Utwórz nową bazę o nazwie projekt1_development poleceniem: 
mysql> create database projekt1_development;
Następnie pokaż istniejące bazy danych poleceniem: 
mysql> show databases; 
Wśród nich powinna być nowo utworzona baza: projekt1_development.
Okienko to możesz pozostawić otwarte, przyda się w dalszej części tutorialu.

Krok 9: Konfigurujemy połączenie z bazą danych

W panelu Rails Navigator (Window->Show View->Rails Navigator) rozwiń projekt1->config i kliknij dwukrotnie database.yml. 

W środkowym panelu powinna wyświetlić się zawartość pliku database.yml.
Tutaj znajdują się ustawienia połączenia z bazą danych, a zatem nazwa hosta (host), nazwa użytkownika (username) i jego hasło(password). Ponieważ pracujemy u siebie (na localhoście) te dane pozostawimy bez zmian. W pliku tym znajduje się także nazwa bazy (database).
Domyślną nazwą jest nazwaprojektu_development, czyli u nas projekt1_development (ha! przecież taką utworzyliśmy w kroku 8!).

Można by pomyśleć, że RadRails pobrał nazwę z bazy danych, tak się jednak nie stało. Skoro domyślną nazwą dla każdego projektu jest nazwaprojektu_development, autor tego tutorialu chcąc zmniejszyć sobie nakład pracy, po prostu tak a nie inaczej nazwał bazę. A zatem gdybyśmy w kroku 8 utworzyli bazę o nazwie abc, w pliku database.yml i tak widniałaby nazwa projekt1_development. Wtedy należałoby ją zmienić na abc.

Krok 10: Tworzymy naszą pierwszą migrację.

Stworzymy pierwszy plik migracji. Co to takiego? Taki mechanizm pozwalający na zmiany struktury bazy danych z poziomu railsów, zmiany te co najważniejsze (jeśli dobrze zaimplementowane) są odwracalne. 
Co być może także ważne dla ciebie używania migracji nie jest konieczna znajomość SQLa, a stworzoną migrację można uruchomić dla różnych typów baz danych, zatem nie musimy się martwić jak zrealizować daną rzecz na konkretnej bazie danych.

Ale bierzmy się do pracy. W panelu gdzie znajduje się zakładka Servers wybierz tym razem Generators (albo Window->Show view->Other... i następnie wybierz z drzewa Rails->Generators). 

W polu wyboru znajdź i zaznacz migration, zaznacz opcję Create, a w polu tekstowym obok wpisz stworz_notke i kliknij Go.

Krok 11: Otwieramy plik migracji tworzącej notkę

W panelu Rails Navigator powinien pojawić się nowy plik. Przejdź do niego: projekt1->db->migrate->001_stworz_notke.rb. Kliknij na nim dwa razy, by go wyedytować. Powinien otworzyć się w środkowym panelu plik 001_stworz_notke.rb następującej treści:

class StworzNotke < ActiveRecord::Migration def self.up end def self.down end end

No pięknie, ledwie stworzyliśmy plik, a on już zawiera jakieś śmieci?! No niezupełnie. Jeśli wiesz co nie co o programowaniu obiektowym to od razu zauważysz, że mamy zdefiniowaną klasę. Jeśli nie wiesz o czym mowa, uwierz autorowi tego tutoriala na słowo, że tam powyżej zdefiniowana jest klasa. Klasa ta zawiera definicję dwóch metod (to takie funkcje, które wykonują zlecone im zadania). Pierwsza (self.up) zostanie wywołana, gdy wywołamy naszą migrację, a druga (self.down) zostanie wywołana, gdy będziemy chcieli cofnąć naszą migrację i przywrócić strukturę bazy danych do stanu sprzed jej wywołania.

Krok 12: Edytujemy plik naszej migracji

Edytuj treść pliku migracji, tak by wyglądał następująco (na jaśniejszym tle wiersze, które należy dodać):

class StworzNotke < ActiveRecord::Migration def self.up   create_table "notki" do |t| t.column "tytul", :string t.column "tresc", :text end end def self.down drop_table "notki" end end

Super, ale co my w ogóle zrobiliśmy? Omówmy wiersze po kolei:

create_table "notki" do |t| tworzy tabelę o nazwie notki z kolumnami (t) zdefiniowanymi poniżej
t.column "tytul", :string tworzy kolumnę o nazwie tytuł i ma on być krótkim tekstem (:string)
t.column "tresc", :text tworzy kolumnę o nazwie tresc i ma ona być dłuższym tekstem (:text)
end kończy definiowanie tabeli
drop_table "notki" usuwa tabelę o nazwie notki

Krok 13: Rake Tasks, czyli zaganiamy Railsy do roboty!

Obok zakładki Server powinna być zakładka Rake Tasks, otwórz ją.

Powinna pojawić się nam rozwijana lista zadań, jak na rysunku powyżej. Najprawdopodobniej jednak pojawi się informacja, iż wymagana jest konfiguracja. Bo przecież dopiero co zainstalowaliśmy RadRailsy.

Należy zatem skonfigurować RadRailsy następująco. Wybierz Window->Preferences->Rails->Configuration i podaj ścieżkę do plików rails i rake. Są one tam, gdzie instalowałeś Ruby (nie RadRails tylko Ruby!).

Dla domyślnego przypadku (ścieżka C:\ruby\) obecnej wersji Ruby będzie to:
Rails Path: C:\ruby\bin\rails
Rake Path: C:\ruby\lib\ruby\gems\1.8\gems\rake-0.7.1\bin\rake


Zwróćcie uwagę na to jakie pliki wybraliście. Pliki, które powinniście wybrać nie powinny mieć żadnego rozszerzenia (sic!), zatem jeśli wybieraliście je przy użyciu przycisku Browse... zwróćcie uwagę, czy nie wybraliście przypadkiem plików z rozszerzeniem .cmd lub .bat, które mogą znajdować się w katalogu razem z szukanymi plikami.

Następnie kliknij Apply, by wprowadzić zmiany i zamknij okno klikając OK.

Teraz powinna już być widoczna rozwijana lista wyboru z zadaniami. Jeśli lista jest pusta musisz odświeżyć widok. Kliknij ikonkę z dwoma żółtymi (a może złotymi) strzałkami i poczekaj. W pasku stanu powinien wyświetlić się napis o ładowaniu listy zadań. Teraz wszystko powinno być jak należy. Wybierz zadanie migracji twojej bazy danych zaznaczając db:migrate, następne pole pozostaw puste (tu można będzie wybrać wersję migracji, którą wykonać, gdyby na przykład kolejna zmiana dokonana w strukturze bazy danych nie była przemyślana i należałoby wrócić do poprzedniego stanu), a następnie kliknij Go.

Krok 14: Migracja wykonana. Jak się o tym przekonać?

Jeśli w zakładce Console nie było żadnego napisu error itp. nasza migracja zapewne wykonała się poprawnie. Jeśli w to wierzysz i nie chcesz zawracać sobie głowy oglądaniem bazy danych możesz przejść do kolejnego kroku. Niedowiarków zaś zachęcam do zapoznania się z plikiem schema.rb (otwórz go z Rails Navigatora wybierając projekt1->db->schema.rb). Znajdziesz w nim aktualny numer wersji migracji, które zostały wykonane (w naszym przypadku powinno być :version => 1).

ActiveRecord::Schema.define(:version => 1) do   create_table "notki", :force => true do |t|     t.column "tytul", :string     t.column "tresc", :text end end

Nadal nie wierzysz, że coś się zmieniło? Przejdź do okienka bazy danych (tego, które otworzyliśmy w kroku ósmym. Jeśli przypadkiem zamknąłeś to otwórz tak jak w kroku ósmym, aby widzieć znak zachęty: mysql>

W naszej bazie po migracji powinna pojawić się tabela notki. Obejrzyjmy więc jak ona wygląda.

Najpierw wybierzmy bazę, którą chcemy oglądać:
mysql> use projekt1_development;
Powinna pojawić się informacja, iż baza została wybrana (Database changed).
Obejrzyjmy tabelę notki:
mysql> show tables;
Polecenie to powinno wymienić nazwy dwóch tabel w naszej bazie: notki oraz schema_info. Wyświetlmy tabelę schema_info poleceniem: 
mysql> select * from schema_info;
Powinniśmy otrzymać aktualny numer migracji. Obejrzyjmy strukturę tabeli notki:
mysql> show columns from notki;
I powinniśmy zobaczyć, że tabela notki zawiera 3 kolumny: tytul i tresc, które sami kazaliśmy utworzyć w kroku 12 oraz utworzoną przez railsy kolumnę id, która będzie identyfikować poszczególne notki w bazie danych (czyli ściślej mówiąc będzie kluczem głównym tabeli notki).

Krok 15: Obsłużmy notkę.

Mamy bazę danych z tabelą notki, ale nie mamy jej obsługi, musimy więc ją zrobić, tak by móc notki dodawać, edytować, usuwać, listować itd. Dużo tego... ale nie jesteśmy sami i jak się zaraz okaże wszystko wykonają za nas Railsy. Posłuży nam do tego komenda generate scaffold (w dosłownym tłumaczeniu generująca rusztowanie), która zbuduje nam gotowy szkielet do obsługi tabeli notki.

I tutaj pojawia się pewna różnica jeśli chodzi o polskie nazwy. Mianowicie scaffold opiera się o angielskie nazwy, gdzie liczbę mnogą tworzy się poprzez dodanie na końcu litery 's' np. book -> books. W naszym przypadku, gdybyśmy chcieli wygenerować szkielet obsługi dla typu notka, scaffold szukałby w bazie danych kolumny notkas związanej z naszym typem notka. Musimy zatem wprowadzić wyjątek (czasem myślę, że język polski składa się z samych wyjątków), nie będzie to wyjątek w sensie informatycznym, lecz zwyczajny potocznie rozumiany wyjątek (taki jak z powiedzenia, że potwierdza regułę). 

W pliku config/enviroment.rb trzeba edytować trzy wiersze. Mam nadzieję, że już kojarzysz jak otworzyć ten plik do edycji (użyj Rails Navigatora). W pliku tym w wierszach 46, 49 i 51 musimy wykasować znak "#" (hash) znajdujący się na początku każdego wiersza oraz edytować wiersz 49 jak we fragmencie kodu poniżej:

# Add new inflection rules using the following format # (all these examples are active by default):  Inflector.inflections do |inflect| #   inflect.plural /^(ox)$/i, "\1en" #   inflect.singular /^(ox)en/i, "\1"    inflect.irregular "notka", "notki" #   inflect.uncountable %w( fish sheep )  end

Hash na początku wiersza oznacza komentarz, usuwając go sprawiamy, iż Railsy będą brały pod uwagę to, co w tych wierszach jest zapisane. W ten sposób poinformowaliśmy Railsy, żeby interpretowały wyjątki liczby mnogiej, w szczególności u nas: liczba mnoga od słowa notka to notki.


Jeśli obok wierszy RadRails nie wyświetla informacji o ich numerach, kliknij prawym klawiszem myszy na wąski pasek po lewej stronie edytowanego pliku i wybierz z menu kontekstowego Show line numbers, powinny pojawić się liczby przy kolejnych wierszach.

Teraz już możemy spokojnie tworzyć szkielet. Podobnie jak w kroku 10 przechodzimy do zakładki Generators, tym razem z listy rozwijanej wybieramy scaffold (opcję Create pozostawiamy zaznaczoną), a obok wpisujemy nazwę: notka i klikamy Go.

Krok 16: Szkielet utworzony. Jak się o tym przekonać?

Aby zobaczyć co nam powstało rozwiń katalog app w Rails Navigatorze. Powstała nam cała masa plików, które będziemy omawiać pojedynczo, wtedy gdy będą nam potrzebne w tym lub kolejnych tutorialach. Ale to, że powstało dużo plików niewiele nam pomogło w obsłudze bazy... czy na pewno? 

Wpisz w przeglądarce adres jak poprzednio, z tą różnicą, że dodaj po nim nazwę naszej tabeli w bazie (a zatem: http://localhost:3000/notki/).

Pojawił nam się Listing tabeli notki (niewiele nam wyświetliło, bo nic jeszcze w niej nie mamy). Kliknij na link New notka, by dodać nową notkę. Wpisz tytuł Pierwsza notka, wpisz jakąś treść, a następnie kliknij Create. Jeśli wszystko odbyło się zgodnie z planem u góry powinien pojawić się zielony napis Notka was successfully created. Jest to flash (dosł. rozbłysk, mignięcie), na potrzeby tego tutoriala nazwijmy to po polsku: flesz. Jest to po prostu krótka informacja, która ukazuje się po konkretnej akcji, w celu poinformowania użytkownika co właśnie zrobił :) Dodaj jeszcze jedną lub dwie notki.

W chwili obecnej na stronie pojawiły nam się przy notkach kolejno linki: Show, Edit i Destroy. Pierwszy pokazuje nam na stronie pojedynczą notkę, drugi umożliwia jej edycję, a trzeci usuwa notkę. Nie jest to jednak takie bezpośrednie usuwanie - sprawdź klikając Destroy. Pojawi się okienko z zapytaniem, czy na pewno chcesz usunąć tę notkę. Jeśli tak - kliknij OK, jeśli nie - kliknij Anuluj.

Krok 17: Po polsku to nie łaska?

Tutorial ten powstał m.in. ze względu na brak tutoriali z RadRailsów w języku polskim. Skoro tak, wydaje się słusznym zrobienie spolszczenia naszej aplikacji. Jeśli jeszcze nie istnieją moduły obsługi języków w Ruby, zapewne powstaną, póki co mamy niewielką aplikację, możemy ręcznie poedytować pliki, choć wymaga to chyba największego nakładu pracy w całym tym tutorialu. Oczywiście ten punkt możesz spokojnie ominąć jeśli tworzysz stronę po angielsku. Natomiast jeśli chcesz, by twój serwis był w języku polskim, należy zadbać o komunikację z użytkownikiem w języku polskim. W tym celu w pliku app/controllers/notki_controller.rb zmień tekst w wierszach 26 i 40 z:

flash[:notice] = 'Notka was successfully created.' flash[:notice] = 'Notka was successfully updated.'
na:
flash[:notice] = 'Notka została utworzona.' flash[:notice] = 'Notka została zmieniona.'

W kolejnych plikach z folderu app/views/notki/ edytuj następujące wiersze:
 

_form.rhtml 4, 7 (dodaj polskie znaki)
edit.rhtml 1, 5, 8, 9 (jak na rysunku poniżej)
Spolszczenia wymagają też nazwy w następujących plikach:
list.rhtml 1, 15-17, 22, 23, 27
new.rhtml 1, 5, 8
show.rhtml 7, 8

A teraz sprawdź w przeglądarce jak wygląda nasza aplikacja.
Czyżby wcięło polskie znaki? No przecież! Nie ustawialiśmy kodowania. Zatem kliknij prawym klawiszem myszy na naszym projekcie w Rails Nawigatorze i z menu kontekstowego wybierz Properties

W oknie dialogowym w polu Text file encoding z listy rozwijanej wybierz UTF-8, następnie wprowadź zmiany klikając Apply i kliknij OK.

Wróćmy teraz do przeglądarki i zobaczmy efekt:

Udało się! Mamy polskie znaki w notkach i linkach, brakuje ich tylko w nazwach kolumn, a to dlatego, że dane te są pobierane z bazy danych, a tam nazwaliśmy je bez polskich znaków. 

Ponieważ z polskimi znakami w różnych bazach danych jest różnie, poza tym przeważnie nie można używać w nazwach spacji, lepiej więc nazywać kolumny bez polskich znaków, natomiast w czasie wyświetlania zamiast pobierać nazwy kolumn, można dodać je z poziomu Railsów.

Koniec i bomba, a kto czytał ten trąba.