Rails pod Ruby Schemat Model – View - Controller
Środowiska pracy Development Test Production Definicja połączeń z bazą danych w pliku database.yml Można definiować własne środowiska
Konwencje nazewnicze Klasy wielką literą + nowe wyrazy wielką Zmienne małą, wyrazy oddzielamy _ Nazwy plików.rb analogicznie jak zmienne Odpowiadające klasom tabele mają nazwę w formie mnogiej, z małych liter i wyrazy oddzielane _, np: LineItem line_items
Active Support Zestaw bibliotek dostępny dla każdego komponentu rails, np: - dodatki do wartości numerycznych(odd?, kilobytes, weeks,...) - daty (from_now, ago,...) - napisów (singularize, pluralize, inne mniej oryginalne,...)
Active support c.d. Wbudowany logger - logger.warn(Nie rób tego!) Testowanie i odpluskwianie - bezposredni dostep do danych poprzez irb (+ breakpointy) - dodatkowy loger STDERR (WEBrick) - funkcja debug(obiekt) wyświetla obiekty w zrozumiały sposób (XML)
Active Record Odwzorowuje wzajemnie dane z bazy i model (klasy) Zmiana w bazie automatycznie poprawia model Można wyłączyć :) dyrektywą set_table_name Problem z bool - forma ? - nadpisanie metody
Serializacja Klasy serializowane do tekstu (format YAML) - zdefiniowanie pola tekstowego w BD - dyrektywa serializacji serialize :nazwa_atrybutu - przypisanie dowolnego obiektu do danego atrybutu
Połączenie z BD Plik database.yml Nadpisanie metody ActiveRecord :: Base.establish_connection Różne parametry w zależności od rodzaju BD
BD CRUD cat.save i cat.save! Odczyt cat = Cat.find(id) cats = Cat.find(id_list) cats = Cat.find(:all, :conditions => tail = 'long' :order => name DESC) cats = Cat.find_all_by_tail('long') cats = Cat.find_by_tail_and_head('long', 'heavy')
...rUD W przypadku szukania po kluczu może wyrzucić wyjątek cat.reload update(5, :pseudo => nowe) update_all(cena = 2*cena,kolor like '%cz%') delete(ids), delete_all(warunki)
Transakcje Pojedyncze intrukcje w obrębie transakcji, także dla zależności Brak wsparcia dla dwufazowego potwierdzenia(two-phase commits) Zagnieżdżone transakcje Cats.transaction do end Cats.transaction(obj1, obj2,...) do end
Walidacja validate() zawsze przed zapisem validate_on_create(), validate_on_update() można się zapytać metodą valid?() def validate_on_create if self.find_by_name(name) errors.add(:name, is already being used) end end
Callbacks
Obserwator Podklasa ActiveRecord ::Observer Domyślnie StajniaObserver obserwuje zdarzenia w stajni Można samodzielnie określić obserwowane modele metodą: observe Cat, Dog, Payment
Zaawansowane atrybuty AR Mapa atrybutów Dostęp przez read_attribute() przechowuje dane o typie Konwersja wewnątrz akcesora def netto Float(read_attribute(wartosc_netto)) end
Id w klasach modelu Porównywanie '==' objektów-modeli na podstawie id Id jest ustalane dopiero po zapisaniu Id jest potrzebne do aktualizacji, cichy błąd
Action Controller Odpowiedź na żądanie Załadowanie controllers/store_controller.rb Stworzenie objektu StoreController Wstrzykniecie helpers/store_helper.rb do kontrolera Załadowanie models/store.rb jeśli istnieje
Mapowanie url config/routes.rb ziom.pl/store/add_to_cart/123 Własne wzorce dopasowania, np: map.connect ':controller/:action/:id' nazwane i nienazwane kontroler metoda parametr wywołania(tu id)
Rozpatrzenie akcji Jeśli odpowiadająca metoda nie jest zaimplementowa wywoływane jest method_missing() Jeśli Kontroler nie implementuje method_missing(), wywoływany jest template odpowiadający kontrolerowi z akcją Jeśli nie ma template'a zdefiniowanego otrzymujemy błąd: Uknown Action
Ciasteczka Ciasteczka w RoR: cookies[:the_time] = Time.now.to_s time = cookies[:the_time] Wartości przechowywane są w postaci łancuchów znakowych
Sesja Działa jak mapa, może przechowywać objekty dające się serializować Przechowuje flash Session_id przechowywany jest w ciasteczku Zmiany poprzez zmiany opcji sesji domyślnej
Flash Łącznik pomiędzy żądaniami, przechowywany w sesji Atrybuty note warning error Metody now – resetuje stan keep – zachowuje informacje do następnego żadania
Filtry i weryfikacja Rodzaje filtrów: before_filter: metoda after_filter: metoda around_filter: klasa z metodami before(controller), after(controller) Pierwsze dwa wywołania mają atrybuty :only i :except, określające akcje, których dotyczy filtr Weryfikatory jako wyszczególniony rodzaj filtrów
Template'y Odnajduje przy pomocy render() w domyślnym katalogu views/nazwa_kontrolera/nazwa_akcji Layouty aplikowane do każdej akcji kontrolera Przydatna funkcja html_escape() {= h()} - coś jak CDATA
Moduły pomocnicze Żeby nie umieszczać za dużo kodu w template'ach warto użyć modułu Helper. Metody Helpera są dostępne w template'ach i layout'ach Dla kontrolera lub aplikacji Wiele wbudowanych modułów udostepniających popularne funkcje pomocnicze
Testy Osobne środowisko(inny schemat) Elementy: Testy funkcjonalne kontrolerów Testy Active Record'ów. Odpala metody test_* w izolowanych scenariuszach Odwołania do Fixtures – nie ma duplikowania danych np. wew. asercji
Fixtures Definiują początkowe zawartość modelu np. definicję kilku przykładowych obiektów danej klasy christmas_book: id:1 title:It's Christmas! price:29,99 date:1.day.from_now
Inne funkcje Cache Na poziomie stron Na poziomie akcji Wbudowane wsparcie dla AJAX Action Mailer Web Services w postaci Action WS Nie do końca satysfakcjonuje specyfikację w3c Ma za zadanie dostarczyć popularną funkcjonalność, często wykorzystywaną w przyrodzie