Skocz do zawartości

Witaj na forum webmasterów Webax.pl.

Wyświetl nową zawartość

Ruby on Rails - alternatywa PHP - część czwarta - projekt


  • Zaloguj się, aby dodać odpowiedź
8 odpowiedzi w tym temacie
Soanvig
Soanvig

    Początkujący

  • Użytkownik
  • PipPipPip
  • 114 postów
#1

Napisano 28 sierpień 2012 - 17:54

Na wstępie chcę zaznaczyć, że nie jestem "master-dżizaster" w RoR, tylko osobą początkującą, mającą pewne pojęcie o tym środowisku. Z tego miejsca pragnę nadmienić, że mam nadzieję, iż nie będę was uczył złych praktyk. Jeśli jednak ktoś uzna fragmenty mojego kodu za po prostu złe, niech się podzieli swoją opinią - z chęcią ją rozważę.

Druga rzecz: poradnik jest pisany specjalnie dla webax.pl i dlatego rozpowszechniać można go tylko poprzez podanie do niego linku prowadzącego właśnie do forum webax.pl i do niego samego lub w przypadku, kiedy na końcu zostanie podany autor w następującej formie:

Soanvig (http://webax.pl)

Przejdźmy do napisania pierwszej aplikacji Rails. W ostatniej części tutoriala stworzyliśmy projekt oraz uruchomiliśmy serwer. Jednak przy tworzeniu projektu warto zwrócić na coś uwagę.

Stwórzmy więc nowy projekt o nazwie: tutorial.

Pierwszym naszym zadaniem będzie stworzenie systemu użytkowników opartego na bazie danych SQLite domyślnie zawartej w Rails. Według moich dotychczasowych obserwacji doszedłem do wniosku, że warto na początku rozpisać sobie cały projekt, gdyż w Rails możemy wtedy sobie wygenerować wszystkie potrzebne elementy już na początku procesu tworzenia. Rozpiszemy go na kontrolery i akcje (metody) kontrolerów oraz modele i pola w tabeli.

Kontrolery:
- account
--- start
--- new
--- remove
--- login
--- logout

Modele:
- User
--- username:string
--- password:string
--- email:string
--- register_date:date

Już wyjaśniam. Wypisałem powyżej metody dla kontrolera account oraz pola w tabeli dla modelu User. Osobiście nie wiem dlaczego model jest pisany z dużej litery, ale wszystkie kody, które dotychczas widziałem miały nazwy modeli napisane z wielkiej litery. Pole id generuje się automatycznie i zawiera liczbę, która zwiększa się z każdym dodanym wierszem do tabeli. Pola u mnie mają nazwy: username, password itd. Po dwukropku znajduje się typ pola.

Oto wszystkie możliwe typy pól dla bazy danych:

:string, :text, :integer, :float, :decimal, :datetime, :timestamp, :time, :date,
:binary, :boolean, :references

Nie jest do końca pewien czym się różni :string od :text, ale wydaje mi się, że chodzi o to, iż :text może zawierać białe znaki. Reszta pól wydaje się być logiczna.

Dobrze, wcielmy teraz nasz projekt w życie. Powyższe podmioty należy teraz wygenerować. Przejdźmy więc do folderu z projektem i wygenerujmy kontroler account oraz model User wraz z metodami i polami dla nich:
rails generate controller account start new remove login logoutrails generate model User username:string password:string email:string register_date:date
Okazuje się, że Rails nie utworzy automatycznie tabeli User w bazie danych. Utworzy natomiast plik, za pomocą którego dopiero utworzymy tabelę. Plik ten znajduje się w folderze ./db/migrate/. Przeprowadźmy więc teraz migrację - czyli wykonanie pliku migracji i utworzenie tabeli:
rake db:migrate
Gdybyśmy chcieli uzupełnić model i tabelę User o dodatkowe pole musielibyśmy sami napisać plik służący do przeprowadzenia operacji migrate. A, co tam! Spróbujmy dodać pole number_of_logins:integer. Integer to liczba całkowita. Najpierw należy utworzyć odpowiedni plik migracji:
rails generate migration AddNumberOfLoginsToUser number_of_logins:integer
Tak. To utworzy nam następujący plik: ./db/migrate/YYYYMMDD[6-cyfrowy numer]_add_number_of_logins_to_user.rb o zawartości:
class AddNumberOfLoginsToUser < ActiveRecord::Migration  def change    add_column :users, :number_of_logins, :integer  endend
W tym momencie sam się głowię, czemu Rails dodał to "s" do nazwy tabeli. Jeśli to skasujemy to przy migracji rake zwróci, że nie ma takiej tabeli.
Składnia zapytania generate migration jest następująca: Add NazwaPola To NazwaModelu nazwaPola:typPola. Generalnie to możemy sobie ten fragment Add-NazwaModelu włącznie nazwać tak jak nam się podoba i po prostu wpisać odpowiedni kod potem. Tylko naprawdę nie wiem o co chodzi z tym "s" i dlaczego jest dodawane do nazwy tabeli przy jej tworzeniu.

Możemy uruchomić migrację za pomocą rake db:migrate. Wyświetli nam się krótki raporcik i mamy dodaną kolumnę/pole do tabeli.

Przerobiliśmy już całą bazę danych. Uruchommy więc sobie terminal i włączmy serwer. Następnie wejdźmy na naszą stronę localhost:3000. Wyświetla się znajome już "Welcome aboard". Jak się tego pozbyć? Po prostu wejdźmy do folderu public i skasujmy plik index.html. Po wciśnięciu F5 w przeglądarce otrzymamy błąd routingu.

Otwórzmy teraz bardzo ważny plik konfiguracyjny, o którym już wspominałem wcześniej: config/routes.rb. Wygląda on następująco:
Tutorial::Application.routes.draw do  get "account/start"  get "account/new"  get "account/remove"  get "account/login"  get "account/logout"  # Instrukcja używania tego pliku zawarta w komentarzu: #end
Tutaj mamy ten fragment, o którym wspominałem - nikt nie będzie mógł się dostać do plików, których nie zdefiniujemy w pliku routes. Widzimy get. Jest to typ żądania. Zajmiemy się też żądaniem post oraz poleceniem root. Żądania get są przekazywane w linku (najprościej - pożądany adres wpisany w oknie przeglądarki), a żądania post służą do przekazywania danych za pomocą formularza. Aktualnie pozwalamy na dostęp do tego, co utworzyliśmy na początku.

Zajmijmy się ustawieniem strony głównej. Niech akcją dla żądanej strony głównej będzie metoda start w kontrolerze account i dodajmy linijkę pod ostatnim get lub między, lub w na początku. Ma się znajdować wewnątrz bloku do -- end. Oto ona:
root :to => "account#start"
Jak się później przekonamy większość adresów podawanych wewnątrz Railsów wygląda podobnie. Omówię krótko formę "account#start", bo przyda nam się to później: najpierw podajemy nazwę kontrolera, a za znakiem krzyżyka (#) metodę będącą częścią podanego wcześniej kontrolera.

Teraz odświeżmy znowu stronę localhost:3000 i oto otrzymamy viewer metody start. Musicie dzieci wiedzieć, że jeśli metoda nie wykona funkcji render to na końcu wyświetli domyślnie swój viewer.

Na tym kończę tą część tutoriala. W następnym zaczniemy pisać już aplikację, a tymczasem możecie już pobawić się viewerem metody start zawartej w ./app/views/account/start.html.erb i wpisać tam jakiś własny kod HTML. Jutro postaram się dostarczyć kolejną część poradnika.

P.S.
@Thelleo, już mnie tak nie plusuj :D
  • 0

[font="Courier;"].oooooooo8....ooooooo......o......oooo...oooo.888.........o888...888o...888......8888o..88...888oooooo..888.....888..8..88.....88.888o88..........888.888o...o888.8oooo88....88...8888..o88oooo888....88ooo88.o88o..o888o.o88o....88..[/font]


Thelleo
Thelleo

    Początkujący

  • Użytkownik
  • PipPipPip
  • 99 postów
#2

Napisano 28 sierpień 2012 - 18:05

Skoro prosisz to już nie plusuje :P, ale i tak powiem, że tutorial bardzo dobry i może pozytywnie wpłynąć na rozwój Webaxa ;)
  • 0

Dołączona grafika


Soanvig
Soanvig

    Początkujący

  • Użytkownik
  • PipPipPip
  • 114 postów
#3

Napisano 28 sierpień 2012 - 20:45

Między innymi po to go piszę :)
  • 0

[font="Courier;"].oooooooo8....ooooooo......o......oooo...oooo.888.........o888...888o...888......8888o..88...888oooooo..888.....888..8..88.....88.888o88..........888.888o...o888.8oooo88....88...8888..o88oooo888....88ooo88.o88o..o888o.o88o....88..[/font]


koprad
koprad

    Żółtodziób

  • Użytkownik
  • Pip
  • 1 postów
#4

Napisano 09 listopad 2012 - 10:20

komenda $ rails generate migration AddCosToProducts cos:string powoduje wygenerowanie kompletnej migracji dodającej do tabeli products pole cos. I to wszystko nie trzeba uzywać sql'owych komend jak piszesz w tutorialu, nie jest to nazwa z butelki jaką mają sobie ludzie zmieniać dowoli ale komenda eliminująca czas tworzenia kodu. To power of RoR http://webax.pl/publ...tyle_emoticons/default/xd.gif moge również opisac nurtujące Cię kwestie s bo taka niewiedza jak ktoś pisze tutorial o RoR to aż się noz w kieszeni otwiera. Jak najbardziej po chłopsku zatem. "s" to w angielskim liczba mnoga.W rails generujesz Model(np: g model Post ) w liczbie pojedynczej oraz powiązany z nim Kontroler (g controller Posts) nazwany w liczbie mnogiej gdyż odnosi sie do wielu danych opisanych modelem zatem również nazwa tablicy jest w liczbie mnogiej. Nie będe się rozpisywał i powielał dobrze juz napisanych przewodników, użyteczne informacje na rubyonrails.pl lub http://apohllo.pl/guides/ pozdr i zachęcam do railsów
  • 0

Soanvig
Soanvig

    Początkujący

  • Użytkownik
  • PipPipPip
  • 114 postów
#5

Napisano 09 listopad 2012 - 15:41

Na wstępie pisałem, że sam jestem nowicjuszem. Tak więc nie używaj tego noża z kieszeni przeciwko mnie.Co do tego "s", to nie jestem debilem i rozumiem, że to jest liczba mnoga. Po prostu nie wiedziałem - po co. Czyli wygląda na to, że to taka "automatyczna logiczna semantyka"? Uważam to za bzdurę, no ale cóż.
  • 0

[font="Courier;"].oooooooo8....ooooooo......o......oooo...oooo.888.........o888...888o...888......8888o..88...888oooooo..888.....888..8..88.....88.888o88..........888.888o...o888.8oooo88....88...8888..o88oooo888....88ooo88.o88o..o888o.o88o....88..[/font]


cap'n
cap'n

    Początkujący

  • Aktywny
  • 67 postów
#6

Napisano 11 listopad 2012 - 17:10

Czyli wygląda na to, że to taka "automatyczna logiczna semantyka"? Uważam to za bzdurę, no ale cóż.

Nie wiem czym miałaby być "automatyczna logiczna semantyka", ale to jest po prostu konwencja. Jedna z głównych zasad, którymi kieruje się rails jest "convention over configuration". Jeśli uważasz to za bzdurę to bardzo szybko się zniechęcisz do railsów.
  • 0

Soanvig
Soanvig

    Początkujący

  • Użytkownik
  • PipPipPip
  • 114 postów
#7

Napisano 11 listopad 2012 - 23:16

Pewnie tak, ale czy hasło konwencji ponad konfigurację, czyli jedna z railsowych zasad, czy ona na pewno robi to co powinna? Powinna oszczędzać czas, ale czy aż w tak skrajnych przypadkach, jak dopisanie literki "s"? Tymczasem osobie nierozeznanej w szczegółach (takiej jak ja) takie coś może conajmniej utrudnić funkcjonowanie. Tak wiem, jeśli się nie umie używać, to i użytkowanie ma się utrudnione. Ale proszę... dopisywanie jednej litery?

Poza tym, tak w gwoli ścisłości, moją konwencją jest tablica "water", natomiast konwencją twórców railsa jest dowalenie mi tam literki "s", ot tak - dla utrudnienia mi życia, popełnienia błędu gramatycznego, traceniu bajta pamięci i dla zmiany mojej konwencji. Więc wydaje mi się, że coś tu "nie halo".
  • 0

[font="Courier;"].oooooooo8....ooooooo......o......oooo...oooo.888.........o888...888o...888......8888o..88...888oooooo..888.....888..8..88.....88.888o88..........888.888o...o888.8oooo88....88...8888..o88oooo888....88ooo88.o88o..o888o.o88o....88..[/font]


cap'n
cap'n

    Początkujący

  • Aktywny
  • 67 postów
#8

Napisano 12 listopad 2012 - 00:04

Ale proszę... dopisywanie jednej litery?

Nie chodzi o konwecję dopisywania jednej litery tylko o konwencję nazw tabel w bazie danych, będących słowem w liczbie mnogiej. Akurat spośród wielu railsowych konwencji ta nie wzbudza we mnie jakichkolwiek wątpliwości, bo przecież w tabeli przechowijesz rekordy, a nie rekord.

Poza tym, tak w gwoli ścisłości, moją konwencją jest tablica "water", natomiast konwencją twórców railsa jest dowalenie mi tam literki "s", ot tak - dla utrudnienia mi życia, popełnienia błędu gramatycznego, traceniu bajta pamięci i dla zmiany mojej konwencji. Więc wydaje mi się, że coś tu "nie halo"

Okej, jasne. Tyle że nikt Ci też nie każe korzystać z RoR. Chcesz korzystać z nazw tabel w liczbie pojedynczej? Proszę bardzo - forkuj projekt i wywal wszystkie wywołania metody pluralize ActiveSupport i wtedy będą wszystkie w liczbie pojedynczej ;) Swoją drogą batalia totalnie nie warta świeczki, bo nazwy tabel w bazie danych są kwestią wyłącznie wewnętrzną i nigdzie nie powinne być jawnie widoczne, więc co za różnica?

(mówiłem, że się zniechęcisz)
  • 0

Soanvig
Soanvig

    Początkujący

  • Użytkownik
  • PipPipPip
  • 114 postów
#9

Napisano 12 listopad 2012 - 15:37

Bynajmniej nie zniechęciłem się - każdy język (czy tam framework) ma własne głupoty, więc czego bym nie wybrał, miałbym na co narzekać.
  • 0

[font="Courier;"].oooooooo8....ooooooo......o......oooo...oooo.888.........o888...888o...888......8888o..88...888oooooo..888.....888..8..88.....88.888o88..........888.888o...o888.8oooo88....88...8888..o88oooo888....88ooo88.o88o..o888o.o88o....88..[/font]