lnxdr
Obećava
- Poruka
- 68
Ovo je tutorial za pocetnike u Rails-u, sa nekim osnovnim poznavanjem kako funkcionise Ruby on Rails i uopste MVC (model-view-controller), REST. Molim vas da ne komentarisete osim u slucaju da moj metod nije u redu, i tom slucaju Vas molim da prilozite ispravan kod, ili tacno mesto gde je greska. Hvala!
Instaliranje RoR-a sam opisao u drugoj temi, tako da cu ovde preskociti. Preporucujem da radite sa Linuxa, i da koristite RVM za instaliranje Ruby jezika. Ako ste instalirali RVM i resetovali racunar, instalirali Ruby, Bundler i Rails, mozete poceti:
Napravite novu aplikaciju, i udjite u folder nakon kreiranja. U ovom slucaju nazvao sam je projector.
Ovo ce napraviti novi direktorijum, i u njemu je sve sto nas zanima. Nazivi fajlova su prilicno jasni, barem ono sto nas zanima. U folderu app nalaze se folderi
Model je taj koji komunicira sa bazom podataka, i opcije koristene uz komandu scaffold su iste koje bi dodali da ste pravili posebno model. Opcije nazivi tabela i njihov tip (naziv:string, opis:text). Model je trenutno prazan, na njega se vracamo kasnije.
Novi kontroler pravimo komandom rails g controller (rails g je isto sto i rails generate). Kao argumenti mogu se dodati funkcije koje zelimo (index, show, create...). Otvorite dobijeni kontroller pod nazivom projects_controller i pogledajte kod. U njemu su vec napravljene rute za sve, i svaka je komentarisana tako da mozete da razumete za cega sluzi. Da bi ste bolje razumeli, pogledajte na primeru koja se funkcija koristi kada korisnik otvori nas web-sajt.
INDEX - metod koji izlistava sve projekte (websajt.rs/projects)
SHOW - metod koji otvara odabrani projekat (websajt.rs/project/1)
DESTROY - brise odabrani projekat (websajt.rs/project/1/delete)
NEW - daje mogucnost da kreiramo novi projekat, npr web-forma (example.com/project/new)
CREATE - pravi novi projekat
EDIT - funkcija koja nam omogucava da izmenimo projekat (poziva UPDATE)
UPDATE - izmenjuje projekat
Vratimo se na za trenutak na pocetak, u folder controllers.Tu vidimo da se u folderu nalazi application_controller. Ako ste procitali osnove rails-a, znate da jedan kontroler moze da koristi drugi, ili da proizilazi iz njega. U ovom slucaju mi imamo ApplicationController, koji je glavni, i svi ostali ce proizilaziti iz njega (ProjectsController < ApplicationController). To znaci da one funkcije koje definisemo u ApplicationController-u su dostupne u svim kontrolerima koji proizilaze iz njega. Kontroleri su uvek u mnozini, dok se modeli pisu u jednini (projects_controller.rb i project.rb u folderu models).
Sada otvorite ProjectsController, i pogledajte funkciju index:
Funkcija show je prazna, ali i dalje obavlja sav potreban posao. Samim tim sto je definisano "def show; end" rails zna da je u pitanju metod koji prikazuje proizvod. Medjutim ono sto takodje koristi metod show, definisano je u donjem delu ispod PRIVATE. To znaci da je metod privatan, i da nece biti koriscen direktno (u HTML na primer ne mozete koristiti PRIVATE metod). Taj metod se zove set_project, i on nije bez razloga privatan. On odredjuje sta ce korisniku biti prikazano.
Napravite bazu podataka uz pomoc funkcije
Kada udjete u folder migrate, primeticete naziv fajlova. Rails automatski pravi migracije, i na pocetku generise broj migracije pre naziva. Otvorite migraciju create_projects i pogledajte unutra. Ovo je kod koji rails koristi da napravi tabele u bazi podataka, u ovom slucaju SQLite3. Citajuci kod shvaticete sami sta se radi. Pravi nova tabela, oznacava se naziv i tip. Necu vas zamari sa dodatnim detaljima za sada.
Evo kako na kraju izgleda ProjectsController, najjednostavniji moguci. Ne koristi JSON kao sto je prvobitno definisao scaffold, nego samo HTML (radi lakseg razumevanja)
Sada otvorite folder views unutar app, i pogledajte folder projects. Unutra imate fajlove sa imenima metoda koje koristimo u kontroleru. Fajlovi su .HTML.ERB (embedded ruby). Omogucava nam da koristimo prikacimo Ruby uz HTML. Tako kada otvorite index.html.erb, vidite da koristimo @projects (instance variable). Uvek pocinje sa @, i dostupna je izmedju metoda, kao i u views. Tako kada hocemo da prikazemo sve projekte, mi imamo
U sledecem tekstu objasnicu kako napraviti novog korisnika, autentikaciju i sve sto je potrebno za sajt. Koristicemo Devise Gem, jednostavan, testiran, i dobro se pokazao.
Instaliranje RoR-a sam opisao u drugoj temi, tako da cu ovde preskociti. Preporucujem da radite sa Linuxa, i da koristite RVM za instaliranje Ruby jezika. Ako ste instalirali RVM i resetovali racunar, instalirali Ruby, Bundler i Rails, mozete poceti:
Napravite novu aplikaciju, i udjite u folder nakon kreiranja. U ovom slucaju nazvao sam je projector.
rails new projector && cd projector
Ovo ce napraviti novi direktorijum, i u njemu je sve sto nas zanima. Nazivi fajlova su prilicno jasni, barem ono sto nas zanima. U folderu app nalaze se folderi
controllers, models, views
izmedju ostalih. Kako bi najlakse razumeli kako Rails funkcionise, koristicemo scaffold funkciju. Scaffold ce napraviti CONTROLLER + MODEL + VIEW
sa vec napisanim kodom za osnovne REST funkcije.rails g scaffold project naziv:string opis:text ukupno:decimal do_sada:decimal aktivan:boolean
Model je taj koji komunicira sa bazom podataka, i opcije koristene uz komandu scaffold su iste koje bi dodali da ste pravili posebno model. Opcije nazivi tabela i njihov tip (naziv:string, opis:text). Model je trenutno prazan, na njega se vracamo kasnije.
Novi kontroler pravimo komandom rails g controller (rails g je isto sto i rails generate). Kao argumenti mogu se dodati funkcije koje zelimo (index, show, create...). Otvorite dobijeni kontroller pod nazivom projects_controller i pogledajte kod. U njemu su vec napravljene rute za sve, i svaka je komentarisana tako da mozete da razumete za cega sluzi. Da bi ste bolje razumeli, pogledajte na primeru koja se funkcija koristi kada korisnik otvori nas web-sajt.
INDEX - metod koji izlistava sve projekte (websajt.rs/projects)
SHOW - metod koji otvara odabrani projekat (websajt.rs/project/1)
DESTROY - brise odabrani projekat (websajt.rs/project/1/delete)
NEW - daje mogucnost da kreiramo novi projekat, npr web-forma (example.com/project/new)
CREATE - pravi novi projekat
EDIT - funkcija koja nam omogucava da izmenimo projekat (poziva UPDATE)
UPDATE - izmenjuje projekat
Vratimo se na za trenutak na pocetak, u folder controllers.Tu vidimo da se u folderu nalazi application_controller. Ako ste procitali osnove rails-a, znate da jedan kontroler moze da koristi drugi, ili da proizilazi iz njega. U ovom slucaju mi imamo ApplicationController, koji je glavni, i svi ostali ce proizilaziti iz njega (ProjectsController < ApplicationController). To znaci da one funkcije koje definisemo u ApplicationController-u su dostupne u svim kontrolerima koji proizilaze iz njega. Kontroleri su uvek u mnozini, dok se modeli pisu u jednini (projects_controller.rb i project.rb u folderu models).
Sada otvorite ProjectsController, i pogledajte funkciju index:
Ruby:
def index
@projects = Project.all
end
# Svi projekti koji ce biti izlistani na strani = Svi projekti
# Project je u jednini, jer je to objekat(model) koji komunicira sa DB
# Ako bi zeleli samo zadnjih 10 projekata, uradili bi ovako:
def index
@projects = Project.last(10)
end
Funkcija show je prazna, ali i dalje obavlja sav potreban posao. Samim tim sto je definisano "def show; end" rails zna da je u pitanju metod koji prikazuje proizvod. Medjutim ono sto takodje koristi metod show, definisano je u donjem delu ispod PRIVATE. To znaci da je metod privatan, i da nece biti koriscen direktno (u HTML na primer ne mozete koristiti PRIVATE metod). Taj metod se zove set_project, i on nije bez razloga privatan. On odredjuje sta ce korisniku biti prikazano.
Ruby:
# Na pocetku koda, before_action samo govori da se pre akcije izvrsi definisan metod.
# U ovom slucaju, pre akcije SHOW, izvrsi se metod SET_PROJECT
before_action :set_project, only: [:show, :edit, :update, :destroy]
... def index
... def show
...
private
# Pre nego sto se izvrsi metod show, pronadji Projekat pod zadatim ID
# Rails koristi polje ID za identifikaciju, kao i u URL
def set_project
@project = Project.find(params[:id])
end
# Ako se doda jos nesto, obavice se nakon ovoga set_project
# Iako je SHOW metod gore prazan, set_project ce pronaci projekat,
# jer smo definisali BEFORE_ACTION
Napravite bazu podataka uz pomoc funkcije
rails db:create
. Standardna baza podataka u Rails-u je SQLite3, medjutim rad sa MySQL ili PostgreSQL se ne razlikuje, sve radimo isto (DB se definise u config-u). Kako bi Rails znao sta treba da uradi, koristimo migracije. Vratite se u glavni folder i idite u db/migrations projector > db > migrate
. Ako ste izvrsili db:create, videcete bazu podataka u folderu DB, i zove se development.sqlite3. U rails-u su Development - Test - Production odvojeni u svakom pogledu, na svaki nacin, sto je jos jedna od prednsoti rails-a. Takodje imate i dokument seed.rb koji koristimo da popunimo bazu podataka sa materijalom za development, pa umesto da kucate sql funkcije, koristite Rails metod Project.create(naziv: PROJECTOR, opis: blablabla..). Mnogo jednostavnije od kucanja SQL-a, i za to je zasluzan ActiveRecord model. On komunicira sa bazom podataka, i videcete da glavni model (ApplicationRecord) proizilazi iz njega (ActiveRecord::Base), kao sto sam objasnio i za ProjectsController.Kada udjete u folder migrate, primeticete naziv fajlova. Rails automatski pravi migracije, i na pocetku generise broj migracije pre naziva. Otvorite migraciju create_projects i pogledajte unutra. Ovo je kod koji rails koristi da napravi tabele u bazi podataka, u ovom slucaju SQLite3. Citajuci kod shvaticete sami sta se radi. Pravi nova tabela, oznacava se naziv i tip. Necu vas zamari sa dodatnim detaljima za sada.
Ruby:
# Polje :id ne morate da pravite, Rails ga pravi sam
# Vreme i datum takodje Rails sam dodaje, created_at kao i updated_at
# Za to je zaduzen t.datetime u sledecem kodu
class CreateProjects < ActiveRecord::Migration[6.0]
def change
create_table :projects do |t|
t.string :naziv
t.text :opis
t.decimal :ukupno
t.decimal :do_sada
t.boolean :aktivan
t.timestamps
end
end
end
Evo kako na kraju izgleda ProjectsController, najjednostavniji moguci. Ne koristi JSON kao sto je prvobitno definisao scaffold, nego samo HTML (radi lakseg razumevanja)
Ruby:
class ProjectsController < ApplicationController
# takodje moze da se koristi OSIM, umesto AKO
# before_action :set_project, except: [:index, :new, :create]
before_action :set_project, only: [:show, :edit, :update, :destroy]
# GET /projects
def index
@projects = Project.all
end
# GET /projects/1
def show
end
# GET /projects/new
def new
@project = Project.new
end
# GET /projects/1/edit
def edit
end
# POST /projects
def create
@project = Project.new(project_params)
if @project.save
redirect_to @project, notice: 'Project was successfully created.'
else
render :new
end
end
# PATCH/PUT /projects/1
def update
if @project.update(project_params)
redirect_to @project, notice: 'Project was successfully updated.'
else
render :edit
end
end
# DELETE /projects/1
def destroy
@project.destroy
redirect_to projects_url, notice: 'Project was successfully destroyed.'
end
private
# Use callbacks to share common setup or constraints between actions.
def set_project
@project = Project.find(params[:id])
end
# Rais proverava polja koja mu mi dozvolimo
def project_params
params.require(:project).permit(:naziv, :opis, :ukupno, :do_sada, :aktivan)
end
end
Sada otvorite folder views unutar app, i pogledajte folder projects. Unutra imate fajlove sa imenima metoda koje koristimo u kontroleru. Fajlovi su .HTML.ERB (embedded ruby). Omogucava nam da koristimo prikacimo Ruby uz HTML. Tako kada otvorite index.html.erb, vidite da koristimo @projects (instance variable). Uvek pocinje sa @, i dostupna je izmedju metoda, kao i u views. Tako kada hocemo da prikazemo sve projekte, mi imamo
@projects.each do |project|; project.naziv; project.opis ...
. Tabela UKUPNO oznacava koliko je ukupno novca potrebno da bi se ostvario projekat, a DO_SADA oznacava koliko je do sada skupljeno. Kasnije cemo ubaciti Bitcoin adrese za ove projekte, i dodati nova polja.U sledecem tekstu objasnicu kako napraviti novog korisnika, autentikaciju i sve sto je potrebno za sajt. Koristicemo Devise Gem, jednostavan, testiran, i dobro se pokazao.