<commit_before>2. Ruby on Rails
================

Ruby on Rails (ili kraće Rails) je framework za razvoj web aplikacija napisan u programskom jeziku Ruby. Dizajniran je sa ciljem da olakša razvoj time što polazi od pretpostavki o tome na koji način programer treba da reši probleme sa kojima se suočava tokom rada.

Rails filozofija uključuje nekoliko vodećih principa:

  * DRY – “Don’t Repeat Yourself” – sugeriše da delove koda ne treba pisati više od jednom.

  * Convention Over Configuration – znači da Rails izlazi u susret programeru sa skupom preporučenih rešenja umesto zahteva za izborom komponenti i niza konfiguracionih datoteka.

  * REST kao šablon za web aplikacije – smatra se da je organizovanje aplikacije u resurse i standardne HTTP upite najbrži put razvoja.

2.1. MVC arhitektura
--------------------

Rails se zasniva na Model, View, Controller (MVC) arhitekturi. Prednosti MVC uključuju:

  * Izolovanje poslovne logike od korisničkog interfejsa

  * Držanje principa DRY

  * Lakše održavanje kod pošto je uvek jasno gde pripadaju različiti tipovi koda 

2.1.1 Modeli podataka
---------------------

Model predstavlja informaciju (podatak) u aplikaciji i pravila po kojima se tim podacima manipuliše. U slučaju Railsa, modeli se koriste prvenstveno za upravaljanje pravilima interakcije sa odgovarajućom tabelom baze podataka. Najčešći slučaj je da jedna tabela baze podataka odgovara jednom modelu u aplikaciji. U modelima se koncentriše najveći deo poslovne logike aplikacije.

2.1.2 Prezentacioni sloj
------------------------

Prezentacioni sloj (view) je korisnički interfejs aplikacije. U Railsu, to su najčešće HTML datoteke sa umetnutim Ruby kodom čija je funkcija ograničena na prezentaciju podataka. Uloga prezentacionog sloja je da usluži podacima web pretraživač, ili uopšte softver koji šalje zahtev ka aplikaciji.

2.1.3 Kontroleri
----------------

Kontroleri povezuju modele i prezentaciju. U Railsu, kontroleri su odgovorni za obradu dolazećih zahteva, upite ka podacima preko modela i predaju tih podataka prezentacionom sloju.

2.2 Komponente Railsa
---------------------

Kompletan skup komponenti koje Rails pruža za razvoj web aplikacija uključuje:

  * Action Controller
  * Action View
  * Active Record
  * Action Mailer
  * Active Resource
  * Railties
  * Active Support

2.2.1 Action Controller
-----------------------

Action Controller je komponenta koja upravlja kontrolerima u Rails aplikaciji. Action Controller obrađuje dolazeće zahteve, izdvaja parametre i otprema ih akciji kojoj su namenjeni. Usluge koje pruža uključuju upravljanje sesijom, kontrola renderovanja template-a (šablona prezentacije) i upravljanje preusmeravanjima (redirections).

2.2.2 Action View
-----------------

Action View upravlja prezentacionim slojem Rails aplikacije - renderovanjem template-a - uključujući ugnježdene i parcijalne šablone, kao i ugrađenu podršku za AJAX.

2.2.3 Active Record
-------------------

Active Record je osnova za sve modele u Rails aplikaciji. Pruža apstrakciju nad bazom podataka, osnovnu CRUD funkcionalnost, napredne mogućnosti pronalaženja zapisa i povezivanja modela.

2.2.4 Action Mailer
-------------------

Action Mailer je framework za izradu email usluga. Može se koristiti za slanje emaila na osnovu šablona, ili primanje i obradu.

2.2.5 Active Resource
---------------------

Active Resource pruža framework za povezivanje poslovnih objekata i REST web servisa. Implementira način za mapiranje web baziranih resursa na lokalne objekte sa CRUD semantikom.

2.2.6 Railties
--------------

Railties pruža kod koji konstruiše nove aplikacije, upravlja njihovom konfiguracijom i povezuje sve komponente framework-a u Rails aplikaciji.

2.2.7 Active Support
--------------------

Active Support predstavlja kolekciju korisnih klasa i proširenja standardne Ruby biblioteke koje koristi kako sam Rails framework tako i Rails aplikacija.

2.3 REST
--------

REST (Representational State Transfer) može, za potrebe pregleda razvoja web aplikacija u Railsu, da se svede na dva principa:

  * Korišćenje identifikatora resursa (što može da se smatra URL-om) za njihovo predstavljanje

  * Prenošenje reprezentacija stanja tog resursa među komponentama sistema

Za osnovu REST (ili "RESTful" kako se često navodi u tekstovima na engleskom jeziku) arhitekture se smatra doktorska disertacija Roya Fieldinga, Architectural Styles and the Design of Network-based Software Architectures [*].

Na primer, zahtev kao što je:

DELETE /photos/17

bi se u Rails aplikaciji smatrao zahtevom za brisanjem Photo resursa čiji je ID 17. U praksi se REST pokazao kao prirodan način modelovanja arhitekture web aplikacija, a Rails to dodatno olakšava time što koristi konvencije koje programera oslobađaju kompleksnosti i razlika među web pretraživačima.

[*] http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm<commit_msg>Some more Rails text<commit_after>2. Ruby on Rails
================

Ruby on Rails (ili kraće Rails) je open source framework za razvoj web aplikacija napisan u programskom jeziku Ruby. 

Rails se temelji na nekoliko vodećih principa:

  * MVC arhitektura

  * DRY – "Don’t Repeat Yourself" – sugeriše da delove koda ne treba pisati više od jednom.

  * Convention Over Configuration – znači da Rails izlazi u susret programeru sa skupom preporučenih rešenja umesto zahteva za izborom komponenti i niza konfiguracionih datoteka.

  * REST kao šablon za web aplikacije – smatra se da je organizovanje aplikacije u resurse i standardne HTTP upite najbrži put razvoja.

2.1. MVC arhitektura
--------------------

Rails se zasniva na Model, View, Controller (MVC) arhitekturi. Prednosti MVC uključuju:

  * Izolovanje poslovne logike od korisničkog interfejsa

  * Držanje pri DRY principu

  * Lakše održavanje koda pošto je uvek jasno gde pripadaju različiti tipovi koda 

2.1.1 Modeli podataka
---------------------

Model predstavlja informaciju (podatak) u aplikaciji i pravila po kojima se tim podacima manipuliše. U slučaju Railsa, modeli se koriste prvenstveno za upravaljanje pravilima interakcije sa odgovarajućom tabelom baze podataka. Najčešći slučaj je da jedna tabela baze podataka odgovara jednom modelu u aplikaciji. U modelima se koncentriše najveći deo poslovne logike aplikacije.

2.1.2 Prezentacioni sloj
------------------------

Prezentacioni sloj (view) je korisnički interfejs aplikacije. U Railsu, to su najčešće HTML datoteke sa umetnutim Ruby kodom čija je funkcija ograničena na prezentaciju podataka. Uloga prezentacionog sloja je da usluži podacima web pretraživač, ili uopšte softver koji šalje zahtev ka aplikaciji.

2.1.3 Kontroleri
----------------

Kontroleri povezuju modele i prezentaciju. U Railsu, kontroleri su odgovorni za obradu dolazećih zahteva, upite ka podacima preko modela i predaju tih podataka prezentacionom sloju.

2.2 Komponente Railsa
---------------------

Kompletan skup komponenti koje Rails pruža za razvoj web aplikacija uključuje:

  * Action Controller
  * Action View
  * Active Record
  * Action Mailer
  * Active Resource
  * Railties
  * Active Support

2.2.1 Action Controller
-----------------------

Action Controller je komponenta koja upravlja kontrolerima u Rails aplikaciji. Action Controller obrađuje dolazeće zahteve, izdvaja parametre i otprema ih akciji kojoj su namenjeni. Usluge koje pruža uključuju:

 * kontrola renderovanja template-a (šablona prezentacije)
 * rutiranje (podrazumevan šema je REST)
 * upravljanje preusmeravanjima (redirections)
 * upravljanje sesijom
 * filtere za pre- i post-obradu odgovora
 * automatski benchmarking i logovanje
 * keširanje

2.2.2 Action View
-----------------

Action View upravlja prezentacionim slojem Rails aplikacije. On uključuje:

 * Ruby jezik za pisanje HTML šablona ERB
 * jezik za pisanje šablona zasnovan na Builder biblioteci koji se koristi za XML i JSON sadržaj
 * pomoćne metode za rukovanje formularima, datumima, linkovima i tekstom
 * podršku za ponovno koriščenje šablona kroz pojam layouta
 * JavaScript i Ajax integraciju

2.2.3 Active Record
-------------------

Active Record biblioteka je osnova za sve modele u Rails aplikaciji. Pruža apstrakciju nad bazom podataka, osnovnu CRUD funkcionalnost, napredne mogućnosti pronalaženja zapisa i povezivanja modela.

2.2.4 Action Mailer
-------------------

Action Mailer je framework za implementaciju email usluga. Može se koristiti za slanje emaila na osnovu šablona, primanje i obradu.

2.2.5 Active Resource
---------------------

Active Resource pruža framework za povezivanje poslovnih objekata i REST web servisa. Implementira način za mapiranje web baziranih resursa na lokalne objekte sa CRUD semantikom.

2.2.6 Railties
--------------

Railties pruža kod koji konstruiše nove aplikacije, upravlja njihovom konfiguracijom i povezuje sve komponente framework-a u Rails aplikaciji.

2.2.7 Active Support
--------------------

Active Support predstavlja kolekciju korisnih klasa i proširenja standardne Ruby biblioteke koje koristi kako sam Rails framework tako i Rails aplikacija.

2.3 REST
--------

REST (Representational State Transfer) može, za potrebe pregleda razvoja web aplikacija u Railsu, da se svede na dva principa:

  * Korišćenje identifikatora resursa (što može da se smatra URL-om) za njihovo predstavljanje

  * Prenošenje reprezentacija stanja tog resursa među komponentama sistema

Za osnovu REST (ili "RESTful" kako se često navodi u tekstovima na engleskom jeziku) arhitekture se smatra doktorska disertacija Roya Fieldinga, Architectural Styles and the Design of Network-based Software Architectures [*].

Na primer, zahtev kao što je:

DELETE /photos/17

bi se u Rails aplikaciji smatrao zahtevom za brisanjem Photo resursa čiji je ID 17. U praksi se REST pokazao kao prirodan način modelovanja arhitekture web aplikacija, a Rails to dodatno olakšava time što koristi konvencije koje programera oslobađaju kompleksnosti i razlika među web pretraživačima.

2.4 Active Record
-----------------

Active Record je zapravo dizajn patern prvobitno objavljen u knjizi Martina Faulera Patterns of Enterprise Application Architecture (Addison-Wesley Professional, 2002). Ruby biblioteka Active Record, čiji je, kao i Railsa, originalni autor <NAME>, jeste implementacija ovog paterna, i njegov glavni doprinos je u tome što otklanja dva velika problema: nedostatak asocijacija i nasleđivanje. Prvi problem je rešen dodavanje makroa koji liče na proširenje programskog jezika, a drugi integracijom paterna nasleđivanja jednom tabelom (Single Table Inheritance).

Osnovni koncept Active Recorda i drugih biblioteka za objektno relaciono mapiranje je da relacione baze podataka mogu da se predstave objektnim kodom ukoliko se tabele baze mapiraju na klase, redovi tabela kao objekti, a polja tabela kao atributi objekata. Na primer, za datu tabelu users u nekoj bazi podataka:

Users table
  id polje (integer; auto-inkrementovan; primarni ključ)
  username polje (text tipa)
  password polje (text tipa)

class User < ActiveRecord::Base
end

U Rails kodu, User instance se mogu kreirati na sledeći način:

# pravi novi User objekat u memoriji, a potom i novi zapis u bazi podataka
user = User.new(:username => "marko")
user.password = "<PASSWORD>"
user.save

# Kreira novi User objekat u memoriji od podataka u users tabeli pod ID-em 1.
# Ekvivalentno ANSI SQL upitu "select * from users where id = 1".
found_user = User.find(1)

# brise zapise iz baze u kojima je username "marko"
User.delete("username = 'marko'")

Active Record se razlikuje od drugih ORM biblioteka, kao što je Java Hibernate, uglavnom po načinu na koji se konfiguriše, odnosno, po opštem nedostatku neophodne konfiguracije. Jedina neophodna konfiguraciona datoteka za pristup bazi podataka je config/database.yml, koja po generisanju novog Rails projekta izgleda ovako:

# SQLite version 3.x
#   gem install sqlite3-ruby (not necessary on OS X Leopard)
development:
  adapter: sqlite3
  database: db/development.sqlite3
  pool: 5
  timeout: 5000

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  adapter: sqlite3
  database: db/test.sqlite3
  pool: 5
  timeout: 5000

production:
  adapter: sqlite3
  database: db/production.sqlite3
  pool: 5
  timeout: 5000

[*] http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm
{'fraction_non_alphanumeric': 0.07869327325394271, 'fraction_numerical': 0.009172835532668169, 'mean_word_length': 3.8193098100038774, 'pattern_counts': {'":': 0, '<': 6, '<?xml version=': 0, '>': 6, 'https://': 0, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2073567', 'n_tokens_mistral': 4553, 'n_tokens_neox': 4453, 'n_words': 1598}