Implementarea Unui Sistem Informatic In Ruby On Rails
IMPLEMENTAREA UNUI SISTEM INFORMATIC IN RUBY ON RAILS
Cuprins
1 Introducere
1.1 Scopul lucrării
2 Tehnologii
2.1 Limbajul Ruby
2.1.1 Prezentare generală
2.1.2 Sintaxă și mod de utilizare
2.1.3 Module
2.1.4 Arrays
2.1.5 Hashes
2.1.6 Ranges
2.1.7 Încapsulare
2.2 MVC
2.2.1 Prezentare generală
2.3 Ruby on Rails
2.3.1 Prezentare generală
2.3.2 Structură
2.3.3 Fluxul de procesare al unei cereri
2.3.4 Active Record
2.3.5 Ruby CRUD
2.3.6 Validarea obiectelor
2.3.7 Active Record Migrations
2.3.8 Asocierea între modele
2.3.9 eRuby
2.3.10 Metode de menținere a unei sesiuni
2.3.11 Tipuri de cereri
2.4 JSON
2.4.1 Descriere
2.5 MySQL
2.6 GIT-version control
2.7 GitHub
2.8 jQuery
2.8.1 Prezentare generală
2.8.2 Funcții callback
2.8.3 Selectori și înlanțuire
2.8.4 Jquery și AJAX
2.9 Ajax
2.9.1 Scurtă descriere
2.10 CoffeeScript
2.11 Bootstrap
2.12 Sass
3 Decrierea platformei
3.1 Funcționalități
3.2 Mod de utilizare
3.2.1 Meniul
3.2.2 Autentificarea
3.2.3 Rolul de administrator
3.2.4 Rolul de profesor
3.2.5 Rolul de student
3.3 Structură
3.3.1 Descriere
3.3.2 Controller-e
3.3.3 Servicii
3.3.4 Rute
3.3.5 Diagrama bazei de date
4 Concluzii
5 Bibliografie
Tabel de figuri
1 Introducere
1.1 Scopul lucrării
Lucrarea de față constă într-o platformă de tip moodle, de invățare la distanță ce se adreseză studenților, profesorilor și instituțiilor de învățământ din mediul universitar.Având în vedere evoluția sistemului informatic din ultimul timp,aceasta a determinat și apariția multor aplicații IT utilizate în procesul didactic,astfel au fost dezvoltate si numeroase platforme de tip e-learning. Scopul unei astfel de platforme este de a oferi interacțiune între profesori și studenți. Învățarea folosind o platformă de tip e-learning are o importanță majoră întrucât mulți oameni preferă să studieze la distanță fie din cauza faptului că nu pot ajunge la facultate,fie că studiază la fără frecvență.
Moodle reprezintă un sistem de administrare a învățării ,un pachet software open-source aflat sub licența GNU, destinat mediului educațional.Este o platformă de e-learning ce oferă servicii de învățare și evaluare.Permite definirea diferitelor tipuri de clase de utilizatori aceștia având anumite tipuri de permisiuni și acces.Orice platformă de acest tip este administrată și monitorizată de către un administrator.
Importanța unei astfel de platforme este una majoră,întrucât oferă posibilitatea învățării de cursuri la distanță.Într-o astfel de aplicație profesorii pot încărca cursuri astfel încât studenții să le poată citi.Cursurile ce se vor urca pe o astfel de platformă pot fi cărți în format electronic,galerii de imagini,fișiere audio și video.Acesta are posibilitatea de a comunica cu ei prin mesaje,de a putea comenta asupra cursurilor încărcate astfel încât studenții să înțeleagă ceea ce au de învățat.
Profesorul poate acorda note studenților,acestea putând fi afișate atât într-un mod public cât și privat.Sunt folosite instrumente de comunicare între utilizatori,precum forumuri pentru discuții,chat-uri sau blog-uri.
Studenții au posibilitatea de a participa la cursurile la care au fost repartizați de către administrator.Pot comunica între ei dar și cu profesorii.Pot da note profesorilor și scrie review-uri la cursuri.
Un administrator are responsabilitatea de a organiza aplicația pe roluri,de a introduce utilizatorii în sistem fie manual,fie prin intermediul unor invitații.El crează anii de studiu universitari,departamentele din cadrul facultății respective,iar apoi pune profesorii la cursurile pe care aceștia le predau cât și studenții la cursurile la care participă .
Moodle permite construirea de site-uri cu conținut interactiv,ce au o structură complexă, interfața oferită fiind una intuitivă și ușor de învățat pentru toți utlizatorii.Așadar,o astfel de platformă oferă o gamă largă de instrumente utile în procesul de predare-învățare-evaluare.
2 Tehnologii
2.1 Limbajul Ruby
2.1.1 Prezentare generală
Ruby este un limbaj de programare dinamic,orientat pe obiecte,bazat pe clase,proiectat astfel încât să aibe cât mai puține dependențe posibile.A fost dezvoltat de către Yukhiro ”Matz” Matsumoto în Japonia în anii 90.Acesta oferă suport pentru paradigmele de programare (funcțională si imperativă).Este un limbaj ”server-side” similar din multe puncte de vedere cu Python ,Perl și Smalltalk.
Ruby este un limbaj orientat pe obiecte în care fiecare tip de date este reprezentată de un obiect.Fiecare funcție este reprezentată de o metodă. Variabilele nu reprezintă obiecte ci referința la acele obiecte.Sintaxa procedurală este acceptată în Ruby dar orice metodă definită în afara scopului unui obiect particular este o metodă ale clasei obiect.Ruby suportă moștenirea simplă,dar nu suportă moștenirea multiplă precum alte limbaje orientate pe obiecte.Un mare avantaj al acestui limbaj o reprezintă portabilitate.Codul care rulează pe o platformă nu mai trebuie recompilat pentru a fi executat pe o altă platformă.Acesta a fost dezvoltat pe GNU/LINUX,însă rulează pe mai multe variante de UNIX,MAC OS X,WINDOWS.Ruby este un limbaj gratuit ce poate fi modificat,copiat și distribuit.Ruby prezintă un colector de memorie reziduală pentru toate obiectele sale.Poate capta excepții precum alte limbaje de programare ca Java sau Python aceasta ajutând în procesul de tratare al erorilor.Acesta poate încărca în mod dinamic biblioteci de extensii în cazul în care sistemul de operate permite.Ruby deține threaduri independente de sistemul de operare.Permite folosirea de multithreading.Se bazează pe următoarele principii definitorii: încapsulare,polimorfism,abstractizare,moștenire.
2.1.2 Sintaxă și mod de utilizare
Ruby nu necesită declararea variabilelor.Insă acestea au mai multe scopuri:
1) var – variabilă locală
2) @var – variabilă de instanță
3) @@var – variabilă de clasă
4) $var – variabilă globală
Variabilele locale sunt variabile definite în cadrul unei metode.Acestea nu pot fi accesate din afara ei având domeniul de vizibilitate doar în interiorul acelei metode.
Variabilele de instanță pot fi folosite în cadrul metodelor pentru orice instanță a unui obiect.
Variabilele de clasă aparține unei clase și are domeniul de vizibilitate doar în interiorul acelei clase.
Variabilele globale au domeniul de vizibilitate atât în interiorul cât și în exteriorul unei clase sau unei metode.
Orice fișier ruby creat trebuie sa aibă extensia rb.
Pentru a rula un program creat în Ruby trebuie să executați din interpretor ruby urmat de numele fișierului deja creat:
Exemplu: ruby sport.rb
În ruby spațiile sau tab-urile sunt total ignorate exceptând atunci când ele apar folosite în string-uri.Identificatorii în Ruby sunt case-sensitive.
BEGIN si END
BEGIN – declară cod ce va fi apelat înainte ca programul să ruleze.
Exemplu: puts ”Acesta este un program Ruby”
BEGIN {
puts ”Inițializarea programului în Ruby”
}
Acesta va avea următorul rezultat:va afișa mai întâi ”Inițializarea programului in Ruby” iar pe urmă va afișa ”Acesta este un program Ruby”.
END – declară cod ce va fi apelat la sfârșitul programului.
Exemplu: puts ”Acesta este un program Ruby”
END {
puts ”Inițializarea programului în Ruby”
}
puts ”Acesta nu este un program Ruby”
Acesta va avea următorul rezultat:va afișa mai întâi ”Acesta este un program Ruby” și ”Acesta nu este un program Ruby” iar pe urmă va afișa ”Inițializarea programului în Ruby”.
Un obiect reprezintă o instanță a unei clase.Crearea unui obiect în ruby se realizează cu ajutorul operatorului ”new” .
Exemplu: ob1=Angajat.new
Structuri conditionale specifice Ruby
unless – execută cod dacă condiția este falsă.Dacă condiția este adevărată se execută
codul de pe ramura else.
Exemplu: unless x>3
puts ” x este mai mare ca 3”
else
puts ”x este mai mic ca 3”
end
2) case – compară expresia specificată de case iar apoi cea specificată de when și execută codul aferent atunci când apare o potrivire între cele două.
Exemplu: $varsta=30
case $varsta
when 0..3
puts ”copil mic”
when 12..16
puts ”adolescent”
when 20..50
puts ”adult”
else
puts ”bătrân”
end
Ruby are trei niveluri de acces la nivelul metodelor folosite:
metode public – metodele publice pot fi apelate de către oricine.Metodele sunt publice în mod default cu excepția metodei ”initialize” care este privată
metode private – metodele private nu pot fi accesate din exteriorul unei clase.Doar metodele de clasă pot accesa membri privați.
metode protected – o metodă protected poate fi apelată doar de obiectele clasei definite și de subclasele acesteia
2.1.3 Module
Modulele reprezintă un mod de a organiza în mod grupat clasele și metodele.Acestea definesc un ”namespace” ce conțin metode și clase.Un modul poate fi apelat folosind metoda module urmată de numele acestuia.Atunci când folosim o metodă în interiorul unui modul folosim sintaxa – nume modul.funcție.
Declarația ”require” are rolul de a importa un modul în interiorul unui fișier.Este similar cu noțiunea de import în Java și cea de include în C și C++.
Declarația ”include” are rolul de a include un modul în interiorul unei clase.
2.1.4 Arrays
În Ruby, Arrays reprezintă colecții indexate într-o anumită ordine al oricărui obiect.Indexarea începe de pe poziția 0 la fel ca în C și Java.Dacă indexul este negativ înseamnă că aceasta începe de la ultimul element din array. Ruby arrays pot deține obiecte precum String,Hash,Integer.
Inițializarea unui array se realizează cu ajutorul instrucțiunii ”new”.
Exemplu: cars=Array.new sau cars=Array.new(20) -specificând dimensiunea pe care o poate avea
O altă metodă de a inițializa un array este folosint metoda Array:
Exemplu:cars=Array[1,2,3,4,5],sau folosind un interval de valori precum:
numbers=Array[0..9]
2.1.5 Hashes
Un hash este o colecție de perechi ”cheie-valoare”.Este asemănător cu un Array exceptând indexul care se obține cu ajutorul cheilor arbitrare al oricărui tip de obiect.
Odinea de parcurgere al unui hash poate fi făcută fie parcurgând cheile acestuia ,fie parcurgând valorile.
Ca și la Arrays există mai multe modalități de a crea un hash.Puteam crea un hash ”empty” cu ajutorul metodei ”new”.
Exemplu : cars=Hash.new
Se poate utiliza orice obiect din ruby ca cheie sau valoare chiar și un array.
2.1.6 Ranges
Ruby folosește trei tipuri de ”ranges”:
ca secvențe – reprezintă cel mai natural mod de a folosi ”ranges” .O secvență are un punct de start și un punct de end și un mod de a produce valori succesive în ea.Ruby crează secvențe folosind operatorii ”..” și ”…” . Diferența între cele două moduri constă în faptul că atunci când se folosește ”..” se crează un range inclusiv iar atunci când se utilizează ”…” se crează un range care exclude ultima valoare.
Exemplu: (1..5) => 1,2,3,4,5
(1…5) => 1,2,3,4
2) ca condiții – se pot folosi ca expresii condiționale
Exemplu:
result=50
when 10..20 puts ”mai puțin”
when 40..60 puts ”corect”
when 70..100 puts ”mai mare”
3) ca intervale – se folosesc pentru a observa dacă anumite valori se regăsesc în intervalul reprezentat de range
Exemplu: if ((1..10) === 7)
puts ” 7 se află în interval”
end
2.1.7 Încapsulare
Încapsularea datelor reprezintă gruparea datelor și funcțiilor într-o singură unitate (clasă). Datele sunt inaccesibile mediului extern și numai funcțiile cuprinse în clasă au acces la ele. Izolarea datelor față de accesul direct din afara clasei poartă numele de "ascunderea datelor". Încapsularea poate fi descrisă ca o barieră protectoare care previne accesarea întâmplătoare a datelor de către altă secvență de cod definită în afara clasei.
2.1.8 Moștenire
Moștenirea reprezintă mecanatorii ”..” și ”…” . Diferența între cele două moduri constă în faptul că atunci când se folosește ”..” se crează un range inclusiv iar atunci când se utilizează ”…” se crează un range care exclude ultima valoare.
Exemplu: (1..5) => 1,2,3,4,5
(1…5) => 1,2,3,4
2) ca condiții – se pot folosi ca expresii condiționale
Exemplu:
result=50
when 10..20 puts ”mai puțin”
when 40..60 puts ”corect”
when 70..100 puts ”mai mare”
3) ca intervale – se folosesc pentru a observa dacă anumite valori se regăsesc în intervalul reprezentat de range
Exemplu: if ((1..10) === 7)
puts ” 7 se află în interval”
end
2.1.7 Încapsulare
Încapsularea datelor reprezintă gruparea datelor și funcțiilor într-o singură unitate (clasă). Datele sunt inaccesibile mediului extern și numai funcțiile cuprinse în clasă au acces la ele. Izolarea datelor față de accesul direct din afara clasei poartă numele de "ascunderea datelor". Încapsularea poate fi descrisă ca o barieră protectoare care previne accesarea întâmplătoare a datelor de către altă secvență de cod definită în afara clasei.
2.1.8 Moștenire
Moștenirea reprezintă mecanismul prin care o clasă extinde funcționalitățile unei alte clase prin preluarea tuturor datelor și comportamentelor acesteia și adăugarea unor funcționalități proprii. Clasa care a fost moștenită se numește superclasă, iar cea care a moștenit se numește subclasă. Dacă unele dintre atributele sau comportamentele moștenite trebuie schimbate, atunci ele pot fi suprascrise. Prin moștenire, subclasa preia comportamentul superclasei.Aceasta, la rândul ei, va prelua comportamentul superclasei sale și așa mai departe până când se ajunge în vârful ierarhiei. În vârful ierarhiei claselor din Ruby se află clasa Basic Object. Aceasta este cea mai generală clasă și toate clasele moștenesc direct sau indirect comportamentul său. Cu cât o clasă se află cât mai jos în ierarhie cu atât ea definește mai concret un anumit scop.
Exemplu: class Animal
def initialize
end
def actiune
end
end
class Caine < Animal
def musca
end
end
În Ruby nu este permisă moștenirea multiplă.O clasă poate moșteni o singură clasă spre deosebire de C++ unde era permisă și moștenirea multiplă. Moștenirea multiplă reprezintă o caracteristică a unor limbaje de programare prin care o clasă poate moșteni trăsăturile și comportamentele mai multor clase. Un beneficiu important oferit de moștenire o reprezintă minimizarea cantității de cod duplicat prin partajarea de cod comun între mai multe subclase.Astfel se ajunge la o mai bună organizare a codului și la crearea de unități mai mici care sunt mai ușor de întreținut.
2.2 MVC
2.2.1 Prezentare generală
MVC (Model-View-Controller) este un model de proiectare folosit în arhitectura aplicațiilor web.Acest model a fost adoptat de multe limbaje de programare și framework-uri.
Scopul este de a se realiza o separare între cele trei componente pe care se bazează.A fost perceput de către programatori ca fiind un model util pentru reutilizarea codului folosit.Acesta permite utilizatorilor să economisească timp atunci când dezvoltă o aplicație ce folosește o interfață cu utilizatorul.
Modelul are rolul de a încapsula date,de a răspunde la cereri și de a notifica view-urile și controller-elle asociate atunci când au loc schimbări.Notificările permit view-ului să producă un rezultat actualizat și controller-ului să schimbe setul disponibil de comenzi.
View-ul are rolul de a solicita datele din model ce sunt necesare pentru a genera un rezultat pentru utilizator.View-ul afișează informația din model sub diverse forme.
Controller-ul are rolul de a acționa atât asupra modelului cât și asupra view-ului și asigură independența acestora.Controlează fluxul de date din model și actualizează de fiecare dată view-ul atunci când au loc modificări.Răspunde de acțiunile trimise de către utilizator.
Separarea responsabilităților permite mai multe view-uri ale aceluiași model.Dacă un utilizator va actualiza datele prin intermediul controller-ului asociat unui anumit view toate celelalte view-uri ce sunt dependente de aceste date vor reflecta schimbările.
MVC implică declanșarea de către utilizator a unei acțiuni.Acțiunea produsă face ca controller-ul să actualizeze modelul,care la rândul său va trimite schimbările înapoi către view.
View-ul se va actualiza cu datele ce sunt primite de la model.Această abordare nu este realizabilă în mediul web din cauza naturii protocolului HTTP.În mediul web avem un controller central ce expediază cererile către alte controller-e.El gestionează cererile primite în următorul mod:expediază cererea către un alt controller corespunzător.După ce acest controller va termina procesarea și va actualiza modelul,controller-ul central va determina view-ul ce trebuie să fie executat în funcție de rezultatul primit.
2.3 Ruby on Rails
2.3.1 Prezentare generală
Ruby on Rails sau simplu Rails este un framework ”open source” ce permite crearea de aplicații web complexe prin componente și configurații simple.Creatorul acestuia este David Heinemeier Hansson.Acesta a devenit încă de la lansarea din anul 2004 unul dintre cele mai populare si puternice tool-uri în crearea de aplicații web.Acesta s-a adaptat rapid la noile tehnologii dezvoltate.Rails a fost unul dintre primele framework-uri ce a implementat stilul de arhitectură cunoscută ca ”REST” (Representational State Transfer) pentru structurarea aplicațiilor web.
Rails este un MVC(model-view-controller) framework ce furnizează structuri pentru baze de date,servicii web și pagini web.Facilitează folosirea standardelor web în transferul de date ca JSON și XML și folosirea HTML,CSS și JavaScript pentru afișarea interfeței cu utilizatorul.
Rails a fost creat pe principiile CoC (Convention over Configuration) și DRY(Don`t Repeat Yourself).CoC este folosit pentru ca un dezvoltator de aplicații să specifice aspectele neconvenționale ale unei aplicații.DRY semnifică faptul că informația este situată într-un singur loc.
Ruby on Rails este separat în numeroase pachete precum ActiveRecord (un sistem relațional de mapare a obiectelor,folosit pentru accesul la baze de date),ActiveResource(ce furnizează servicii web),ActionPack,ActiveSupport și ActionMailer.
Ruby on Rails este instalat folosind un pachet ce este inclus în toate versiunile apărute,
cunoscut ca RubyGems.Rails rulează pe toate sistemele de operare.Acesta a fost dezvoltat împreună cu un server de baze de date ca MySQL sau PostgreSQL și un server web precum Apache.
2.3.2 Structură
Pentru a crea o aplicație nouă trebuie folosită comanda ”rails new” de la linia de comandă sau de la terminal.Aceasta crează un schelet al aplicației în directorul ales de programator.
În continuare vom prezenta structura directoarelor unei aplicații create.
app/ – aici se află codul aplicației noi create ce include modele,view-uri,controller-e și helperi.
app/assets – aici sunt localizate fișierele CSS(cascading style sheets),fișierele JavaScript și imagini.
bin/ – sunt localizate fișiere binare executabile
config/ – configurarea aplicației
db/ – fișierele bazei de date
doc/ – documentarea pentru aplicației
lib/ – librăria modulelor disponibile
lib/assets – librăria pentru fișiere CSS ,JavaScript și imagini
log/ -fișierele de logare a aplicației
public/ – datele ce sunt accesibile publicului
bin/rails – program pentru generarea codului,de pornire a serverului local
test/ – aici se află partea unde se face testarea aplicației
tmp/ – sunt localizate fișiere temporare
vendor/ – aici se află plugin-uri si gem-uri
vendor/assets –plugin-uri pentru CSS și JavaScript
README.rdoc – scurtă descriere a aplicației
Rakefile – task-uri ce sunt disponibile prin intermediul comandei rake
Gemfile – aici se află depozitate gem-urile necesare în dezvoltarea aplicației
Gemfile.lock – o listă de gem-uri ce asigură că toate copiile aplicației folosesc aceeași versiune de gem-uri
config.ru – se află un fișier de configurare pentru Rack middleware
.gitignore – pattern-uri de fișiere ce sunt ignorate de Git
Dezvoltarea unei aplicații necesită și rularea acesteia pe un server.Comanda folosită pentru a porni un server web depinde de mediul ce se folosește.Pe un sistem local trebuia rulată comanda
”rails sever”.Odată ce este pornit serverul,browserul folosește adresa ”localhost/3000”.
2.3.3 Fluxul de procesare al unei cereri
Rails urmează principiul arhitectural MVC (model-view-controller) ce forțează separarea între domeniul logic (business logicul aplicației) și prezentarea logică asociată cu interfața grafică (GUI).În cazul aplicațiilor web domeniul logic conține datele modelelor în timp ce GUI este doar o pagină web în browser. Sistemul de procesare al unei cereri este următorul: browserul trimite un request ce este recepționat de serverul web și verificat de un controller care va decide ce urmează a fii executat.Uneori acesta va afișa un view ce reprezintă template-ul ce este convertit în HTML și trimis înapoi către browser.În site-urile web ce sunt foarte dinamice controller-ul interacționează cu un model ce este un obiect în Ruby care reprezintă un element al site-ului și este în procesul de comunicare cu baza de date.După invocarea modelului controllerul afișează view-ul și returnează pagina web browserului în format HTML.
Figură 1-Fluxul de procesare a unei cereri
2.3.4 Active Record
Active Record reprezintă modelul,ce este nivelul responsabil din sistem cu reprezentarea bussiness logicului unei aplicații.Acesta facilitează crearea și folosirea obiectelor de bussiness a căror date necesită o memorare persistentă în bazele de date.Active Record este un pattern ce reprezintă o descriere a unui sistem de tip ORM (Object Relational Mapping).Obiectele dețin atât persistența datelor cât și comportamentul acestora.ORM reprezintă o tehnică ce conectează obiectele unei aplicații cu tabelele,într-un sistem de baze de date relaționale.Folosind ORM,proprietățile și relațiile dintre obiecte într-o aplicație pot fi ușor memorate și regăsite într-o bază de date fără a fi nevoie de a se scrie instrucțiuni SQL,astfel accesul la baza de date va fi făcut mai rar.
Active Record folosește convenții de nume pentru coloanele tabelelor din baza de date,în funcție de scopul acestora.
1) Foreign Keys – aceste câmpuri trebuiesc numite urmând patternul ”singularized_table_name_id”.Acestea sunt câmpurile pe care Active Record le va folosi atunci când sunt create asociații între modele.
2) Primary Keys – Active Record folosește într-un mod obișnuit o coloană numită id, aceasta fiind cunoscută ca cheie primară.Când se folosește Active Record în scopul de a crea tabele,această coloană va fi creată automat.
3) created_at – setează automat data curentă și ora la care înregistrarea a fost creată.
4) updated_at – setează automat data curentă și ora la care înregistrarea a fost modificată
5) type – specifică faptul că modelul utilizează moștenirea singulară a tabelelor.
6) association_name_type –memorează tipurile de asocieri polimorfice.
7) table_name_count – utilizat pentru a calcula numărul de obiecte ce aparțin unei asocieri
Crearea unui model în Active Record se realizează foarte simplu:tot ceea ce trebuie făcut este să se moștenească clasa ”Active Record::Base”.
Exemplu: class Car < Active Record::Base”
end
Astfel se va crea un model Car,ce mapează un tabel ”car” în baza de date.Făcând aceasta se va avea la îndemână posibilitatea de a mapa coloanele fiecărui rând din tabel cu atributele instanței modelului.
2.3.5 Ruby CRUD
Crud reprezintă un acronim pentru : Create,Read,Update,Delete.Active Record crează în mod automat metode ce permit unei aplicații să manipuleze datele memorate în tabele.
Create – Obiectele din Active Record pot fi create dintr-un hash ,iar atributele acestora vor fi setate manual după creere.Metoda new va returna un obiect nou,în timp ce create ca returna obiectul și îl va salva în baza de date.
Exemplu: user=User.create (name:”Michael” age:23)
Exemplu: user=User.new
user.name = ”Michael”
user.age = 23
user.save
Read- Este utilizat pentru a accesa obiecte din baza de date.
Exemplu: users=User.all
Michael=User.find_by(name:”Michael”)
user=User.first
Update – În momentul în care un obiect a fost găsit,atributele acestuia pot fi modificate cât și salvate în baza de date.
Exemplu: user=User.find_by (name: ”Michael”)
user.name=”Mike”
user.save
Delete – În momentul în care un obiect a fost găsit acesta poate fi distrus,ștergându-l astfel din baza de date.
2.3.6 Validarea obiectelor
Active Record permite validarea starii unui model înainte ca acesta să fie memorat în baza de date.Sunt câteva metode care permit verificarea modelelor și validarea valorilor atributelor sale.Se poate valida un obiect astfel încat valorile atributelor acestuia să nu fie empty,obiectul să fie unic,să nu existe în baza de date .Validarea este o foarte importantă problemă considerând persistența obiectelor în baza de date .Pentru ca o modificare să fie persistentă și în baza de date spre exemplu pentru metoda ”save” aceasta trebuie efectuată în modul ”save!” ,altfel pot apărea erori precum ”Active Record :: Record Invalid”.
2.3.7 Active Record Migrations
Migrațiile reprezintă un mod convenabil de a modifica schema într-un mod consistent și ușor.Avantajul constă în faptul că nu va mai fi nevoie de scrierea de SQL,permițând realizarea acestora într-un mod independent.O schemă inițial nu conține nimic,iar fiecare migrație ce are loc o modifică ,adăugând sau ștergând tabele ,coloane sau intrări.Active Record va modifica fișierul db/schema.rb astfel încât să se potrivească cu structura bazei de date.
Exemplu: class Employee < ActiveRecord :: Migration
def change
create_table :employee do |t|
t.string :name
t.integer :age
t.timestamps null: false
end
end
end
Această migrație crează un tabel numit Employee ce conține coloanele name și age.O cheie primară numită id va fi adăugată implicit,aceasta fiind folosită pentru toate modelele din Active Record .Timestamp va adăuga două coloane created_at și updated_at.Inițial nu există niciun tabel în baza de date.Pentru ca acestea să existe trebuie migrate.Există și procedeul de eliminare a tabelelor din baza de date.
Migrațiile sunt memorate ca fișiere în directorul db/migrate ,câte una pentru fiecare clasă de migrații.Numele fișierului este de forma ”YYYYMMDDHHMMSS_create_employee.rb”,
reprezentând timpul când s-a efectuat aceasta.Comanda pentru realizarea unei migrații este următoarea: $rails generate migration CreateEmployee
Această comandă va crea o migrație goală.
Exemplu: class CreatEmployee < ActiveRecord :: Migration
def change
end
end
Modelul și generatorul scaffold vor crea migrații potrivite pentru adăugarea unui nou model.Migrațiile conțin instrucțiuni pentru crearea de tabele.Atunci când se produce o migrație pot fi adăugate numele și tipul coloanelor ce urmează a fi create.
Exemplu: $rails generate model Employee name:string age:integer
Această migrație va genera un tabel .
Exemplu: class Employee < ActiveRecord :: Migration
def change
create_table :employee do |t|
t.string :name
t.integer :age
t.timestamps null: false
end
end
end
Pentru a rula o migrație trebuie executată comanda rake db:migrate.Rularea se va face în ordinea datei creării modelului.Atunci când se execută comanda rake db:migrate se invocă db:schema:dump.Se va modifica fișierul db/schema.rb astfel încât să se potrivească cu structura bazei de date.
Dacă se dorește inversarea unei migrații se execută comanda $rake db:rollback .
Se utilizează de foarte multe ori în cazurile în care programatorii introduc greșit date de la tastatură și se dorește corectarea acestor erori.
Pentru a crea o bază de date,a adăuga o schemă și a o inițializa cu date introduse se folosește comanda rake db:setup.Pentru a șterge baza de date se folosește rake db:reset.Această instrucțiune este echivalentă cu rake db:drop db:setup.
Pentru a rula o migrație într-un anumit mediu de lucru,acesta va trebui specificat.În modul standard aceasta rulează în mediul de dezvoltare.Pentru a rula într-un alt mediu va trebui setată variabila RAILS_ENV.
Exemplu: $bin/rake db: migrate RAILS_ENV=test
2.3.8 Asocierea între modele
Asocierea între modele se folosește pentru a ușura operațiile comune și codul scris.Cu asocierile folosite de ActiveRecord putem spune ce conexiuni există între modele.În Rails o asociere reprezintă o conexiune între două modele ActiveRecord.Asocierile sunt făcute în ”macro-style” ,deci se pot adăuga în mod declarativ caracteristici modelelor.
Rails suportă șase tipuri de asocieri:belongs_to,has_one,has_many,has_many :through,
has_one :through,has_and_belongs_to_many.
O asociere de tipul belongs_to setează o conexiune de tipul one-to-one cu un alt model,asta însemnând că fiecare instanță a unui model declarat aparține unei singure instanțe a celuilalt model.
Exemplu: class Dog < ActiveRecord :: Base
belongs_to :animals
end
Asocierea de tipul belongs_to folosește forma de singular.Dacă s-ar folosi forma de plural va apărea următoarea eroare: ”constantă neinițializată Dog::Animals”.Aceasta se întâmplă deoarece Rails în mod automat referă numele clasei din numele asocierii.Migrația va crea un tabel în baza de date.
Exemplu: class CreateDog < ActiveRecord :: Migration
def change
create_table :animals do |t|
t.string :name
t.timestamps null: false
end
create_table :dog do |t|
t.belongs_to :animals, index: true
t.timestamps null: false
end
end
Asocierea de tipul has_one setează o conexiune de tipul one-to-one cu un alt model.
Aceasta indică faptul că fiecare instanță a unui model conține o instanță a unui alt model. Exemplu: class Animal < ActiveRecord :: Base
has_one :dog
end
Tabelele ce se vor crea în urma migrației vor arăta astfel:
Exemplu: class CreateAnimal < ActiveRecord :: Base
def change
create_table :animal do |t|
t.string :name
t.timestamps null: false
end
create_table :dog do |t|
t.belongs_to :animal, index: true
t.timestamps null: false
end
end
end
O asociere de tipul has_many folosește o conexiune de tipul one-to-many cu un alt model.Această asociere indică faptul că fiecare instanță a unui model are zero sau mai multe instanțe ale celuilalt model.
Exemplu: class Animal < ActiveRecord :: Base
has_many :dogs
end
Numele celuilalt model este pluralizat atunci când se declară o asociere de tipul has_many
Tabelele corespunzătoare ce se crează sunt de tipul următor:
class CreateAnimals < ActiveRecord :: Migration
def change
create_table :animals do |t|
t.string :name
t.timestamps null: false
end
create_table :dogs do |t|
t.belongs_to :animal, index:true
t.timestamps null: false
end
end
end
O asociere de tipul has_many :through este folosită pentru a seta o conexiune de tipul many-to-many cu un alt model.Asocierea indică faptul că modelul declarat poate avea zero sau mai multe instanțe a celuilalt model,fiind folosit un al treilea model de legătură .
Exemplu: class Angajat < ActiveRecord :: Base
has_many :cereri
has_many :comenzi, through: :cereri
class Cereri < ActiveRecord :: Base
belongs_to :angajat
belongs_to :comenzi
class Comenzi < ActiveRecord :: Base
has_many :cereri
has_many :angajați through: :cereri
Tabelele ce se crează în urma migrației sunt:
class CreateCereri <ActiveRecord ::Migration
def change
create_table :angajați do |t|
t.string :name
t.timestamps null: false
end
create_table :comenzi do |t|
t.string :name
t.timestamps null: false
end
create_table :cereri do |t|
t.belongs_to :angajati, index:true
t.belongs_to :comenzi, index:true
t.timestamps null: false
end
end
end
O asociere de tipul has_one :through setează o conexiune de tipul one-to-one cu un alt model.Această asociere indică faptul că modelul declarat poate avea o singură instanță a celuilalt model prin intermediul unui al treilea model.
Exemplu: class Angajat < ActiveRecord ::Base
has_one :comandă
has_one :cerere through: :comandă
end
class Comandă < ActiveRecord :: Base
belongs_to :angajat
has_one: cerere
end
class Cerere < ActiveRecord :: Base
belongs_to :angajat
end
Tabelele ce se crează în urma migrației sunt:
class CreateCerere < ActiveRecord :: Migration
def change
create_table :angajaț do |t|
t.string :name
t.timestamps null: false
end
create_table :comandă do |t|
t.belongs_to :angajat, index: true
t.timestamps null: false
end
create_table :cereri do |t|
t.belongs_to :comandă, index: true
t.timestamps null: false
end
end
end
O asociere de tipul has_and_belongs_to_many crează o conexiune de tipul many-to-many cu un alt model, fără intervenția unui alt model.
Exemplu: class Angajat < ActiveRecord :: Base
has_and_belongs_to_many :comenzi
end
class Comandă < ActiveRecord :: Base
has_and_belongs_to_many :angajați
end
Tabelele ce se crează în urma migrației sunt:
Class CreateAngajațiAndComenzi<ActiveRecord::Migration
def change
create_table :angajați do |t|
t.string :name
t.timestamps null: false
end
create_table :comenzi do |t|
t.timestamps null: false
end
create_table :angajați_comenzi, id: false do |t|
t.belongs_to :angajați, index: true
t.belongs_to :comenzi, index: true
end
end
end
Un alt mod de asocieri mult mai avansat îl reprezintă asocierile polimorfice.Într-o astfel de asociere, un model poate aparține la mai mult de un singur model ,pe o singură asociere.
Exemplu: class Picture < ActiveRecord :: Base
belongs_to :images, polymorphic: true
end
class Person < ActiveRecord :: Base
has_many :pictures, as: :images
end
class Product < ActiveRecord :: Base
has_many :pictures, as: :images
end
Tabelele ce se crează în urma migrației sunt:
class CreatePictures < ActiveRecord :: Migration
def change
create_table :pictures do |t|
t.string :name
t.integer :images_id
t.string :images_type
t.timestamps null: false
end
add_index :pictures, images_id
end
end
Dacă numele celuilalt model nu poate fi derivat din numele asocierii se poate utiliza opțiunea
class_name pentru a înlocui numele modelului.
Exemplu: class Comandă < ActiveRecord :: Base
belongs_to :angajat, class_name: ”Patron”
end
2.3.9 eRuby
Un view în configurarea Rails este un fișier erb ce este convertit în HTML.Serverul folosește Ruby încorporat în view-urile HTML cu fișiere ce au extensia html.erb.ERuby (Embedded Ruby) este un sistem de template-uri ce înglobează cod Ruby în documente text similar ca la ASP,JSP.
Codul înglobat este recunoscut ușor după perechea de delimitatori <% %> . Blocurile de cod înglobat sunt evaluate și înlocuite cu rezultatul obținut în urma evaluari.
Exemplu : < % print ”eRuby” %>
2.3.10 Metode de menținere a unei sesiuni
Protocolul HTTP este "stateless", adică de fiecare dată când clientul solicită o pagină web, se deschide o conexiune separată cu server-ul și server-ul nu reține nicio informație din cererea precedentă. Există trei metode prin care se poate menține o sesiune între client și server.
O primă metodă o reprezintă folosirea cookie-urilor. Un cookie reprezintă o cantitate mică de date trimisă de server și stocată în browser-ul clientului în timp ce acesta navighează pe site. De fiecare dată când utilizatorul încarcă site-ul, browser-ul trimite această cantitate mică de informații înapoi către server pentru a-l notifica asupra ultimelor activități efectuate de utilizator. Un server poate atribui un unic ID de sesiune ca un cookie pentru fiecare client și fiecare cerere inițiată de client va fi recunoscută utilizând acel cookie. Este posibil ca această metodă să nu fie una eficientă pentru că de multe ori browser-ul nu suportă cookie-uri.
O altă metodă prin care se poate realiza o sesiune între client și server poate fi implementată prin câmpurile ascunse. Un server web poate trimite un formular HTTP cu un singur câmp împreună cu un ID de sesiune unic după cum se observă în exemplul următor:
<input type="hidden" name="sessionid" value="12345">
Prin includerea acestui camp, la trimiterea formularului, numele specificat și valoarea sa sunt automat incluse în datele de tip GET sau POST. Această metodă ar putea fi una eficientă pentru menținerea sesiunii, dar facând click pe un link obișnuit (<a href …>) nu presupune executarea unui formular. Deci, câmpurile ascunse nu suportă sesiuni complete.
Cea de-a treia metodă este adăugarea de informații la sfârșitul adresei URL care să identifice sesiunea. Această metodă este o alegere bună atunci când browser-ele nu suportă cookie-uri, dar dezavantajul aici constă în faptul că fiecare adresă URL trebuie generată în mod dinamic chiar dacă pagina este una statică.
Pe lângă cele trei metode menționate mai sus, server-ul web utilizează interfața HTTPSession pentru a crea o sesiune între clientul HTTP și server-ul HTTP. Sesiunea persistă pentru o anumită perioadă de timp prin mai multe conexiuni sau cereri din partea utilizatorului.
2.3.11 Tipuri de cereri
Cele mai folosite tipuri de cereri între un client și un server sunt GET și POST. O cerere de tip GET preia informații de la server în funcție de anumiți parametri. Acești parametri sunt reprezentați în format cheie-valoare și adăugați la adresa URL corespunzătoare cererii. Parametrii sunt separați de adresa URL prin simbolul "?". Această metodă este folosită numai pentru recuperarea datelor. Limita maximă pentru trimiterea datelor este de 2048 de caractere, dar poate să difere în funcție de browser. Metoda GET nu trebuie folosită atunci când se trimit informații sensibile către server precum parole. Parametrii rămân în istoricul browser-ului pentru că fac parte din adresa URL.
Metoda POST este folosită atunci când se dorește transmiterea de informații către server, precum datele dintr-un formular. Spre deosebire de metoda GET unde informațiile sunt atașate adresei URL corespunzătoare cererii, metoda POST transferă informațiile prin antetele protocolului HTTP. Informațiile pot conține atât caractere ASCII cât și date în format binar. Metoda POST nu are restricții cu privire la cantitatea informațiilor trimise. Ea este mai sigură decât metoda GET pentru ca parametrii nu sunt stocați în istoricul browser-ului și este folosită pentru transmiterea de informații sensibile.
2.4 JSON
2.4.1 Descriere
JSON (JavaScript Object Notation) este un format ce este folosit în schimbul de date.
Acesta este ușor de scris și de citit pentru oameni,ușor de analizat și generat pentru mașini.Este folosit pentru a trimite date între un server și o aplicație web.Reprezintă o alternativă pentru formatul XML.Chiar dacă a derivat din limbajul JavaScript,JSON este un format de date independent,disponibil într-o mare varietate de limbaje de programare.Este un limbaj ideal pentru schimbul de date pentru că folosește convenții și proprietăți familiare programatorilor care folosesc limbaje precum C,C++,C#,Java,JavaScript,Python și altele.
Formatul JSON este construit pe două structuri:o colecție de perechi nume-valoare și o listă de valori ordonate. Prima structură este realizată de un obiect, înregistrare, structură, dicționar, tabel hash sau vectori asociativi. Cea de-a doua structură este realizată de un vector, listă sau secvență.Un obiect reprezintă un set neordonat de perechi nume-valoare. Acesta începe cu "{" (acoladă deschisă) și se termină cu "}" (acoladă închisă). Fiecare nume este urmat de ":" (două puncte) și perechile nume-valoare sunt separate prin virgulă. Un vector este o colecție ordonată de valori. Acesta începe cu "[" (paranteză dreaptă deschisă) și se termină cu "]" (paranteză dreaptă închisă). O valoare poate fi un string între ghilimele, un număr, true, false, null, un obiect sau un vector. Aceste structuri pot fi imbricate. Un string este o secvență de zero sau mai multe caractere Unicode puse între ghilimele. Un string este o secvență de zero sau mai multe caractere Unicode puse între ghilimele. Acesta este asemănător cu string-urile din C sau Java. Un număr este asemănător cu numerele din C sau Java, excepție făcând formatele octal și hexazecimal care nu sunt folosite. De asemenea, pot fi inserate spații între oricare perechi de elemente. Cu excepția unor detalii de codificare, aceste elemente descriu limbajul.
Exemplu:
{employees”:[
{ ”firstName” :”Jack”, ”lastName” : ”Martin”},
{ ”firstName” :”Daniel”, ”lastName” :”Silver”},
{ ”firstName” :”Matt”, ”lastName” : ”Brewster”}
]
}
2.5 MySQL
MySQL este un sistem open source de gestiune a bazelor de date care se bazează pe SQL (Structured Query Language) pentru procesarea datelor dintr-o bază de date. MySQL rulează pe o mare varietate de platforme, incluzând Linux, UNIX, Mac OS și Windows. Chiar dacă poate fi folosit într-o gamă variată de aplicații, MySQL este cel mai adesea asociat cu aplicațiile web și este o componentă importantă a grupului LAMP(Linux-Apache-MySQL-PHP).
LAMP este o platformă de dezvoltare web care utilizează Linux ca sistem de operare, Apache ca server web, MySQL ca sistem de gestiune a bazelor de date și PHP ca limbaj de scripting orientat pe obiecte. MySQL a devenit o alternativă populară la bazele de date private datorită vitezei și fiabilității. MySQL se livrează fără interfață grafică pentru administrarea bazelor de date MySQL sau pentru gestiunea datelor conținute în ele. Utilizatorii pot folosi linia de comandă sau programe desktop și aplicații web care creează și gestionează baze de date MySQL. Un exemplu de instrument vizual pentru modelarea bazei de date MySQL este MySQL Workbench.
2.6 GIT-version control
Git este un sistem open source de versionare distribuit ce pune accent pe viteză și pe
integritatea datelor.Acesta permite multor dezvoltatori software să lucreze la aceeași sursă de cod.Git a fost dezvoltat inițial de Linus Torvalds pentru kernelul Linux în anul 2005 și de atunci a devenit cel mai dezvoltat sistem de versionare folosit în dezvoltarea software.A fost folosit în mod extensiv în proiectul Gnome,adesea fiind un impediment pentru programatorii aflați la început de drum.
La fel ca la majoritatea sistemelor de versionare fiecare director din Git este un depozit cu un istoric complet și un sistem complet de capabilități de urmărire,independent de accesul la internet sau la un server central.Serverele dedicate de Git ajută printre alte caracteristici să adaugi acces ,să afișeze conținutul unui depozit.O altă caracteristică o reprezintă managementul de depozite multiple. Un depozit Git poate fi clonat într-un sistem de fișiere comun,și accesat de către alte persoane.Pentru ca să fie accesat de un utilizator ”remote”,acesta are nevoie de software-ul de Git instalat ,urmând pe urmă să se logheze.
Fiecare programator clonează o copie a depozitului din Git și apoi urmează să lucreze la clona realizată separat de ceilalți programatori.Când aceștia fac schimbări,ele sunt comise local.Apoi le pun inapoi în depozitul creat din Git.Astfel o serie de comit-uri pot fi testate local.Fiindca toate operațiile au loc local,viteza de executare este foarte mare și pot fi executate fără o conexiune la depozitul original.Git are trei stări în care se pot afla fișierele sale:”commited,modified,staged”.
Starea ”commited” semnifică faptul că datele sunt salvate în mod sigur în baza de date locală.
Starea ”modified” înseamnă că au fost schimbat fișierele dar nu au fost ”commited” în baza de date încă.Cea de a treia stare și anume cea de ”staged” semnifică faptul că au fost marcate fișierele modificate din versiunea curentă pentru a le trece în starea de ”commit”.
Pentru a inițializa un depozit nou trebuie executată comanda ”git init”.Această comandă crează un subdirector numit ”.git” ce conține întregul schelet de fișiere al depozitului.
Pentru a alege ce fișiere urmează să fie ”commited” trebuie executată comanda git add.În cazul în care se dorește o copie a unui depozit existent se folosește comanda ”git clone”.urmat de adresa url unde va fi depozitat.
Exemplu: git clone https://github.com/modul1/modul1
Această comandă crează un director numit ”modul1”,inițializând un director .git în acesta,urmând apoi să pună toate datele din acel depozit.
Pentru a verifica în ce stare sunt anumite fișiere se execută comanda ”git status”.
Atunci când un proiect se află în punctul de a fi distribuit se execută comanda ”git push [remote-name] [brach name]”.
2.7 GitHub
GitHub este un serviciu de găzduire web folosit pentru proiectele de dezvoltare a software-ului ce utilizează sistemul de control al versiunilor Git.A fost lansat în anul 2008.
Spre deosebire de Git care este un serviciu ce utilizează linia de comandă,GitHub furnizează o interfață grafică și desktop ,dar și integrare pe partea de mobile.
Acesta oferă două moduri de găzduire a proiectelor open-source, unul public și unul privat. Software-ul ce folosește GitHub a fost scris în Ruby on Rails și Erlang.
Pentru a contribui la conținutul site-ului și a putea urca proiecte pe el ,utizatorii trebuie să își creeze un cont.Aceștia au posibilitatea de a crea noi depozite,de a le șterge,de a contribui cu cod la depozitele altor useri,de a comunica cu ceilalți membri ai comunități .
Github deține un grafic ce afișează contribuția fiecărui programator la propriile depozite cât și a celorlalți dar și ordinea în care au fost create aceste depozite.
2.8 JavaScript
2.8.1 Prezentare generală
JavaScript este un limbaj de programare dinamic.Este folosit ca parte a aplicațiilor ce rulează în browser,a căror implementări permit scripturilor ”client-side” să interacționeze cu utilizatorul,să controleze browserul, permit comunicarea asincronă,cât și modificarea conținutului afișat. Este suportat de către majoritatea browserelor fără să fie nevoie de utilizarea de plugin-uri.Este utilizat de asemenea în programarea ”server-side” împreună cu Node.js pentru crearea de jocuri,aplicații desktop și mobile.
JavaScript este clasificat ca un limbaj ”prototype scripting” cu un conținut dinamic și funcții ”first-class”.Aceste caracteristici fac din acesta un limbaj ”multiparadigmă ,ce suportă programarea orientată pe obiecte ,programarea funcționala și imperativă.Sintaxa limbajului JavaScript este derivată din cea a lui C,în timp ce semantica și designul au fost influențate de Scheme și Self.JavaScript poate fi folosit și în alte medii cum ar fi aplicații desktop,documente PDF.Pe partea de client JavaScript a fost inițial implementat ca un limbaj de programare interpretat .Acesta respectă standardele ECMAScript.A fost inventat și implmentat de către Netscape ,fiind o marcă înregistrată a corporației Oracle.A devenit unul dintre cele mai populare limbaje de programare pe partea de web.
JavaScript folosește marea majoritate a sintaxei programării structurale din C cum ar fi folosirea instrucțiunilor if,while,for,switch.Acesta face deosebirea dintre expresii și declarări.O diferență sintactică față de C o reprezintă inserarea automată de separatori,astfel programatorii vor putea omite acest aspect.
2.8.2 Conținutul dinamic
La marea majoritatea limbajelor de scripting,tipurile au asociate valori,nu variabile.JavaScript suportă diverse moduri de a testa tipul unui obiect.Un exemplu ar fi acela că o variabilă ce memoreazăun număr poate să memoreze mai târziu un string.
JavaScript este aproximativ în întregime un limbaj orientat pe obiecte.Obiectele din JavaScript sunt reprezentate de array-uri asociative ,folosite împreună cu prototype.
Proprietățile numelui unui obiect sunt chei de string-uri.Acestea suportă două sintaxe ce sunt echivalente.
Exemplu: obj.y = 5 sau obj[y] = 5
Aceste proprietăți și valorile lor pot fi modificate și sterse.Ele pot fi enumerate folosind o instrucțiune repetitivă ca for..in.
Funcțiile de tipul ”first-class” reprezintă chiar obiecte.Acestea dețin proprietăți și metode .JavaScript folosește funcții imbricate.O astfel de funcție este o funcție ce este definită în interiorul altei funcții.Este creată de fiecare dată când cealaltă funcție este apelată.
Codul JavaScript poate fi plasat în <body> sau în <head> al unei pagini HTML.Acesta trebuie inserat între tagurile <script> și </script>.Un alt mod de inserare este acela de a folosi tagul <script type = ”text/javascript”>.Mai poate fi folosit în fișiere externe.Scripturile folosite în fișiere externe sunt utile în momentul în care același cod este utilizat în paginiweb diferite.Pentru a utiliza un astfel de script va trebui pus numele acestuia în atributul sursă.
Exemplu: <script src=”thisscript.js”></script>
JavaScript poate afișa datele în moduri diferite:
prin folosirea window.alert()
prin scrierea acestuia într-un fișier HTML folosind document.write()
prin scrierea acestuia într-un fișier HTML folosind innerHTML
prin scrierea acestuia în consola unui browser folosind console.log()
JavaScript folosește identificatori ce sunt case-sensitive.
2.8.3 Tipuri de ferestre
JavaScript utilizează următoarele tipuri de ferestre de dialog:alert,prompt,confirm.Ele aparțin obiectului Window.
Exemplu: <script>
window.alert(”Welcome”);
</script>
Astfel va fi afișată o fereastră în care va fi afișat mesajul ”Welcome”.
Exemplu : <script>
window.prompt(”mesaj”,”default”)
</script>
Într-o fereastră de tip prompt ,”mesaj” reprezintă textul ce va afișat în fereastră,iar ”default” reprezintă textul ce va apărea în căsuța de input.
Exemplu: <script>
Culoare=window.confirm(”Culoarea este verde?”);
if (culoare) {
alert (”Corect”);
else alert (”Incorect”);
</script>
Într-o astfel de ferestră va fi afișat textul din variabila culoare împreună cu două butoane unul ”OK” iar celălalt ”CANCEL”.Dacă se apasă butonul ”OK” va fi afișat o fereastră de tip alert în care va fi afișat mesajul ”Corect” iar dacă se apasă butonul ”CANCEL” se afișează în fereastra
Alert mesajul ”Incorect”.
2.9 jQuery
2.9.1 Prezentare generală
JQuery este o bibliotecă de JavaScript proiectată să ruleze pe marea majoritate de tipuri de platforme,având rolul de a simplifica scrierea de cod JavaScript.Fiind folosit de peste 80% dintre cele mai vizitate 10 000 de site-uri web,jQuery este cea mai folosită bibliotecă de JavaScript folosită în ziua de azi.Sintaxa sa,a fost proiectată să faciliteze navigarea intr-un document,selectarea de elemente DOM ( Document Object Model),gestiunea de evenimente și dezvoltarea de aplicații bazate pe AJAX(Asynchronous JavaScript and XML),crearea de animații.
Jquery furnizează posibilitatea pentru programatori de a crea plug-in-uri bazate pe această bibliotecă de JavaScript.Abordarea modulară pe care se bazează jQuery permite crearea de pagini și aplicații web dinamice.Multe task-uri comune ce necesită multe linii de cod pentru a fi realizate sunt încapsulate în metode pe care le poți apela într-o singură linie de cod.
Sintaxa foarte simplă a acestei biblioteci face ca task-urile cândva complicate să devină chiar foarte plăcute.Mulți programatori au fost atrași foarte repede de eleganța și claritatea sa.Înțelegerea noțiunilor și a elementelor de bază se realizează într-un mod foarte ușor,dar poate dura luni sau ani pentru a aprecia în întregime amploarea și profunzimea acestei biblioteci.
Aceasta conține foarte multe caracteristici pe care poate nu le știi; odată ce afli despre ele, îți pot schimba în mod semnificativ modul în care alegi să rezolvi problemele.
"Când am început să contruiesc jQuery, în 2005, am avut un simplu scop în minte: am vrut să fiu capabil să scriu o aplicație web care să funcționeze corect în toate browser-ele majore fară a fi nevoie, ulterior, de a corecta bug-uri. Ca o persoană cu un fundament în informatică, am fost foarte surprins că atât de mulți programatori și non-programatori au considerat jQuery ca fiind convingător. Partea cea mai bună este abilitatea de a învăța de la orice persoană care foloseste această bibliotecă."
În continuare vom analiza și descrie principalele caracteristici ale acestei librării. Sintaxa jQuery a fost special adaptată pentru selectarea de elemente și executarea de acțiuni asupra lor. Sintaxa de bază este $(selector).action().
Exemple:
$(”p”).hide()(ascunde toate elementele paragraf, <p>);
$(this).hide()(ascunde elementul curent);
$(”#verifică”).hide() (ascunde elementul cu id-ul "verifică").
$(”.verifică”).hide()(ascunde toate elementele cu clasa "verifică");
Aplicații moderne ce se bazează pe JavaScript folosesc anumite metodologii discrete care execută codul Javascript numai după ce documentul a fost complet încărcat. Orice traversare și manipulare a documentului necesită ca acesta să fie complet încărcat înainte ca orice operație să fie executată asupra sa. Modul prin care jQuery determină momentul când clientul, cel mai adesea un browser web, a încărcat complet documentul, se realizează prin intermediul metodei ready() (gestionar de evenimente). Această metodă are un singur parametru, o funcție. Aceasta conține codul JavaScript care trebuie executat imediat ce documentul este pregătit pentru a fi manipulat. Evenimentul ready() înlocuiește evenimentul pur JavaScript, window.onload.
2.9.2 Funcții callback
O componentă extrem de importantă ce o dă jQuery o reprezintă funcțiile callback.Acestea sunt derivate din paradigma de programare cunoscută ca programare funcțională.
Programare funțională reprezintă folosirea funcțiilor ca argumente. O funcție callback, numită și funcție de nivel înalt, este o funcție dată ca parametru unei alte funcții și executată în interiorul acestei funcții.
Exemplu:
$(”#btn”).click(function (){
alert (”btn clicked”);
});
În exemplul de mai sus, am pasat o funcție ca parametru metodei click. Aceasta din urmă va apela (sau executa) funcția dată ca parametru.
În JavaScript funcțiile pot fi tratate ca obiecte.Acestea pot fi stocate în variabile pot fi returnate,folosite sau create de alte funcții.Când se trimite o funcție callback ca parametru unei alte funcții,se trimite doar definiția funcției.Aceasta nu se execută în parametru. Funcția nu este urmată de parantezele "()" ca atunci când vrem să apelăm o funcție. Din moment ce definiția funcției este dată ca parametru, ea poate fi executată în orice moment. Ceea ce este important de menționat este că funcția callback nu este executată imediat.Aceasta este apelată la un anumit moment în interiorul funcției care o conține.
2.9.3 Selectori și înlanțuire
Selectorii reprezintă una dintre cele mai importante componente ale librăriei jQuery. Selectorii permit selectarea și manipularea de elemente HTML. Ei sunt folosiți pentru a găsi sau selecta elemente HTML în funcție de id,clase,atribute,tipuri,valori de atribute. Aceștia se bazează pe selectorii existenți de tip CSS, dar furnizează și alți selectori proprii. Toți selectorii din jQuery încep cu jQuery ( sau alias-ul $() ). Prin pasarea unui selector funcției jQuery, acesta traversează întregul document și localizează nodul definit de expresia dată.Înlănțuirea metodelor folosite de jQuery returnează un obiect care poate fi folosit pentru a apela o altă metodă.Astfel se crează o înlănțuire permițându-se executarea mai multor metode pe același set de elemente. Browser-ul nu va trebui să găsească elementele mai mult de o singură dată. Scrierea de cod va deveni mult mai rapidă și mai ușor de întreținut. De asemenea, codul va fi rulat mai repede.
2.9.4 Jquery și AJAX
JQuery oferă suport pentru Ajax, iar funcțiile callback sunt des întâlnite atunci când sunt trimise cereri către server în mod asincron. Prin trimiterea de cereri asincrone se continuă execuția script-ului, iar o funcție callback este folosită pentru a fi executată numai după ce răspunsul generat de server a fost primit. Metoda jQuery prin care sunt trimise cereri în mod asincron este $.ajax(options), unde "options" reprezintă un set de perechi cheie-valoare necesare pentru configurarea cererii Ajax. Cele mai importante opțiuni sunt:
url: reprezintă un string care conține o adresă URL către care se trimite cererea;
async: în mod implicit, toate cererile se realizează asincron. Dacă se dorește ca cererile să fie sincrone, această opțiune trebuie setată pe "false". Cererile realizate între diferite domenii nu suportă operații sincrone. Important de menționat este faptul că cererile sincrone pot bloca temporar browser-ul, dezactivând orice altă acțiune cât timp cererea este activă;
data: reprezintă datele care vor fi trimise către server. Dacă acestea nu sunt în format string, atunci se va realiza o conversie. Acest string va fi adaugat la adresa URL în cazul cererilor de tip GET. Datele trebuie introduse în formatul cheie-valoare;
dataType: reprezintă tipul de date așteptat ca răspuns de la server. Tipurile de date ce sunt disponibile sunt următoarele: xml, script, json, jsonp, html,text;
success: reprezintă o funcție care va fi executată în momentul în care cererea se va realiza cu succes. Funcția primește trei parametri: datele primite de la server formatate conform parametrului dataType, un string care descrie starea cererii și obiectul XMLHttpRequest;
error: o funcție care va fi apelată dacă cererea va eșua. Funcția primește trei argumente: obiectul XMLHttpRequest, un string care descrie tipul erorii care s-a produs și un obiect opțional pentru excepții, în cazul în care vreo excepție a apărut;
type: reprezintă tipul cererii (GET sau POST) ce va avea loc, implicit tipul cererii fiind GET. Pot fi folosite și alte tipuri de cereri, precum PUT sau DELETE, dar acestea nu sunt suportate de toate browser-ele;
timeout: reprezintă perioada de întârziere (în milisecunde) a execuției cererii. Această perioadă începe în momentul în care apelul $.ajax() are loc;
complete: reprezintă o funcție care va fi apelată imediat ce cererea s-a terminat (după ce funcțiile callback success și error au fost executate). Funcția primește două argumente: obiectul XMLHttpRequest și un string care reprezintă starea cererii ("success", "notmodified", "error", "timeout", "abord" sau "parsererror").
JQuery prezintă două alternative pentru funcția $.ajax() și anume $.get() ce este folosită
pentru a prelua date de la server în cazul cererilor de tip GET și $.post() ce este folosită în cazul cererilor de tip POST.
Marea majoritate a librăriilor JavaScript folosesc simbolul $ ca nume de variabilă sau funcție.
În cazul jQuery,$ reprezintă un alias pentru jQuery ,asta însemnând că toate funcționalitățile oferite de această librărie sunt disponibile fără a fi nevoie să se folosească simbolul $. În cazul în care se folosește o altă librărie JavaScript alături de jQuery, acesta din urmă oferă o metodă, $.noConflict(), prin care returnează controlul simbolului $ către noua librărie. De asemenea, jQuery permite crearea de alias-uri pentru "jQuery".
Exemplu:
var a = jQuery.noConflict();
a(”div p”).hide();
2.10 Ajax
2.10.1 Scurtă descriere
Ajax reprezintă un grup de tehnici de dezvoltare web folosite pe partea de client pentru a crea aplicații web asincrone. Ajax permite ca paginile web să fie actualizate asincron prin schimbul de cantități mici de date cu server-ul. Acest lucru face posibilă actualizarea unor părți ale paginilor web fară a fi nevoie de a se reîncărca întreaga pagină. Paginile web clasice, care nu folosesc Ajax, necesită reîncărcarea întregii pagini în cazul în care conținutul ar trebui să se modifice.În mod normal,paginile web au nevoie de reîncărcare pentru actualizarea conținutului.
Pentru aplicații web de email acest lucru înseamna că utilizatorii trebuiau să-și reîncarce singuri inbox-ul pentru a vedea dacă primeau noi mail-uri. Printre dezavantaje se numără viteza redusă și necesitatea intervenției utilizatorului. Când utilizatorul își reîncărca pagina, server-ul trebuia să reconstruiască întreaga pagină și să retrimită browser-ului resursele de HTML, CSS, Javascript precum și email-ul utilizatorului. Această abordare era foarte ineficientă. Ideal, server-ul ar fi trebuit să trimită doar noile mesaje ale utilizatorului și nu întreaga pagină. În 2003, toate browser-ele majore au rezolvat această problemă prin adoptarea obiectului XMLHttpRequest(XHR), permițând browser-elor să comunice cu server-ul fară a necesita reîncărcarea paginii.
Obiectul XMLHttpRequest face parte din grupul de tehnologii numit AJAX (Asynchronous JavaScript and XML). Folosind AJAX, datele pot fi trimise de la browser către server prin intermediul acestui obiect, fară a trebui ca pagina să fie reîncărcată. Odată cu abordarea pe scară largă a obiectului XMLHttpRequest, a devenit posibilă construirea de aplicații web precum Google Maps și Gmail.
Cererile de tip Ajax sunt declanșate de codul Javascript.Codul va trimite o cerere către o adresă URL și, când primește un răspuns, o funcție callback poate fi declanșată pentru a gestiona răspunsul. Din cauză că cererea este asincronă, restul codului continuă să se execute în timp ce cererea este procesată, fiind necesară o funcție callback pentru gestiunea răspunsului.
Din nefericire, browser-ele implementează diferit acest mecanism folosit de AJAX obligând programatorii să țină cont de toate browser-ele pentru a se asigura că cererile de tip AJAX funcționează corect în orice mediu. Din fericire, jQuery furnizează suport pentru Ajax înlăturând diferențele dureroase dintre browser-e.
Multe aplicații bazate pe jQuery nu folosesc XML.În schimb acestea transportă date ce sunt în formatul JSON (AJAJ-Asynchronous JavaScript and JSON). Spre deosebire de predecesorul său, AJAX, care folosește XML, în AJAJ schimbul de informații între server și client se face strict prin JSON. Din 2013, termenul AJAJ se folosește foarte rar, iar AJAX este folosit indiferent de formatul datelor returnate de cererea asincronă.
AJAJ are multe avantaje față de predecesorul său AJAX precum schimbul de date în format JSON asigurând o procesare mai rapidă pentru browser și ajutând programatorii să lucreze mai ușor cu datele, acestea fiind primite de la server ca obiecte native Javascript.Astfel se elimină nevoia de a accesa date în format XML, fapt care sporește complexitatea.
2.11 CoffeeScript
CoffeeScript este un limbaj de programare care compilează codul în JavaScript.Sintaxa sa a fost inspirată din Ruby,Python și Haskell și este folosit pentru a îmbogăți concizia și lizibilitatea JavaScript-ului.Acest limbaj este preferat și folosit în special de către programatorii Ruby on Rails.CoffeeScript a fost inclus începând cu versiunea Ruby on Rails 3.1.Acesta a fost creat de Jeremy Ashkenas în anul 2005.Compilatorul a fost scris în Ruby.În CoffeeScript aproape orice reprezintă o expresie și spre deosebire de JavaScript acestea returnează o valoare.Un avantaj al acestui limbaj este reprezentat de faptul că este permisă omitirea acoladelor și parantezelor.Spre exemplu multe bucăți de cod se pot distinge prin identare în locul parantezelor și acoladelor.Apelul funcțiilor se realizează în mod implicit și obiectele sunt adesea detectate în mod automat.CoffeeScript este foarte sensibil la spații .Acesta permite apelul funcțiilor implicite și obiectelor cât și folosirea unei identări semnificative.Codul compilat este adesea mai dificil de citit decât codul JavaScript.
2.12 Bootstrap
Bootstrap reprezintă o colecție de unelte ce facilitează crearea de site-uri și aplicatii web.Conține template-uri de design pentru tipografie bazate pe HTML și CSS, formulare, butoane, navigare și alte componente de interfață, precum și extensii opționale de Javascript. În prezent, este cel mai apreciat proiect de pe GitHub și este folosit de companii importante.
Acesta a fost dezvoltat de doi angajați de la Twitter ca un framework intern pentru a încuraja consistența instrumentelor interne. În luna august 2011 a fost prezentat publicului ca un proiect open-source.
Bootstrap este compatibil cu ultimele versiuni ale celor mai folosite browser-e.
Unul dintre marile avantaje îl reprezintă crearea de design-uri receptive, oferind instrumente de dezvoltare a paginilor web care se ajustează dinamic în funcție de caracteristicile dispozitivelor folosite.
Un alt avantaj îl reprezintă documentația foarte bine structurată cu numeroase exemple,
snippet-uri. Bootstrap se bazează pe un design modular și este format dintr-o serie de fișiere LESS care implementează diferite componente ale framework-ului. un fișier numit bootstrap.less include celelalte fișiere. Schimbările pot fi făcute modificând fișierele LESS, prin folosirea componentelor prezente în aceste fișiere sau prin folosirea utilitarului web de customizare înaintea descărcării pachetului de fișiere CSS și Javascript, în funcție de preferințe.
Pe lângă elementele HTML obișnuite, Bootstrap oferă și alte elemente de intefață reutilizabile precum butoane cu trăsături speciale,mesaje de avertizare,etichete, paginări,navigare.
Pe lângă aceste elemente, Bootstrap oferă și câteva componente de Javascript sub forma unor plugin-uri jQuery. Acestea furnizează elemente adiționale de interfață precum căsuțe de dialog, tooltip-uri, elemente drop-down.De asemenea,Bootstrap oferă controale pentru framework-ul de JavaScript ,AngularJS ,acestea fiind cunoscute ca UI Bootstrap.
2.13 Sass
Sass (Syntactically Awesome Stylesheets) este un limbaj de stilizare creat de către Hampton Catlin și dezvoltat de Natalie Weizenbaum în anul 2007.După versiunile sale inițiale creatorii au continuat extinderea Sass cu SassScript,un simplu limbaj de scripting utilizat în fișierlee Sass.
Sass este un limbaj de scripting care este interpretat în CSS (Cascading Style Sheets).SassScript este limbajul de scripting.Sass conține două sintaxe.Sintaxa inițiala cunoscută ca ” sintaxa identată”folosește o sintaxă similară cu Haml.Folosește identarea pentru a separa blocuri de cod și caractere de linie nouă pentru a separa regulile.Noua sintaxă ”SCSS” folosește blocuri formatate asemănătoare celor din CSS.Folosește acolade pentru a separa blocuri de cod și semicoloane(punct și virgulă) pentru a separa linii din același bloc de cod.Identarea sintaxei și fișierele SCSS folosesc extensiile .sass,respectiv .scss.
CSS3 conține o serie de selectori și pseudoselectori ce grupează reguli care sunt aplicate la ele.Sass,extinde CSS permițând o serie de mecanisme disponibile în limbajele de programare orientate pe obiecte ,dar care nu sunt disponibile în CSS3.În momentul în care un SassScript este interpretat acesta crează blocuri de cod CSS pentru diferiți selectori ce sunt definiți în fișierele Sass.Interpretorul Sass translatează SassScript în CSS.
Sass este open-source și a fost codat în Ruby.Acesta utilizează următoarele mecanisme:moștenirea selectorilor,variabile,amestecarea proprietăților.
3 Decrierea platformei
3.1 Funcționalități
Facilitățile ce sunt oferite de aplicație sunt următoarele:
crearea de conturi de către administrator,fie manual,fie prin intermediul invitațiilor
organizarea pe roluri :existența a trei roluri –administrator,profesor și student;
administratorul setează rolul celorlalți useri
administratorul crează un an nou de studii,atașând departamente și cursuri la acel an de studii
administratorul atașează profesorii și studenții la cursurile din anul respectiv
profesorii pot adăuga materiale la cursurile la care predau;aceștia nu pot accesa cursurile la care nu au fost repartizați;pot da note studenților și pot scrie mesaje la cursurile atașate
studenții pot vedea doar cursurile la care au fost repartizați de către administrator;pot vizualiza atașamentele de la cursuri și pot comenta la acestea;își pot vedea propria notă, primită la cursurile la care participă dar și notele celorlalți studenți
profesorii pot uploada fișiere de orice format
news-feed;profesorii și studenții vor fi avertizați printr-un mesaj atunci când au fost repartizați la un anumit curs
organizarea comentariilor sub formă arborescentă
toți utilizatorii sunt listați intr-o pagină ce este accesibilă doar administratorului
3.2 Mod de utilizare
3.2.1 Meniul
Meniul este alcătuit din 3 componente principale:Users,Study Years și numele utilizatorului ce este logat.Numele platformei alături de logo-ul său este plasat în partea stângă.Imediat după acesta urmează două legături către paginile de useri si ani de studiu.În partea dreaptă se află numele utilizatorului autentificat alături de clopoțelul care ne arată atunci când se primește o notificare.Acest meniu este accesibil doar administratorului.
Figură 2-Partea din stânga meniului
Figură 3-Partea din dreapta meniului
Atunci când utilizatorul se loghează acesta va primi un mesaj de întâmpinare.Pentru delogare se va face click pe butonul logout situat în colțul din dreapta-sus
Figură 4-Opțiunea de delogare
După ce utilizatorul va selecta opțiunea de logout, va fi redirecționat către pagina de autentificare.Dacă utilizatorul va selecta opțiunea ”My Account” acesta va fi redirecționat către pagina de editare,acolo unde își va putea schimba parola cu care se loghează.
Figură 5-Opțiunea de schimbare a prolei
Se va cere să se introducă noua parolă aleasă,urmată de confirmarea acesteia, cât și parola curentă.
Odată ce acesta va apăsa butonul de update parola se va schimba
3.2.2 Autentificarea
Pentru a putea avea acces la anumite privilegii ale platformei ,vizitatorul trebuie să se autentifice.Pentru asta utilizatorul trebuie să se afle pe pagina de autentificare.
Vizitatorul va trebui să completeze două câmpuri:adresa de e-mail și parola acestuia.Odată ce acesta va apăsa butonul de logare iar aceasta va fi realizată cu succes ,va apărea un mesaj corespunzător.
Figură 6-Formularul de logare
Figură 7-Mesaj de succes
Utilizatorul are posibilitatea de a alege opțiunea ”Remember me” astfel încât parola să fie salvată de către browser și să nu mai fie nevoie ca de fiecare dată aceasta să fie introdusă.
În cazul în care cel puțin unul dintre acestea este incorect (nu se găsește în baza de date), atunci va apărea un mesaj de eroare corespunzător.
Figură 8-Mesaj de avertizare
3.2.3 Rolul de administrator
Odată ce administratorul s-a autentificat acesta are posibilitatea de a crea noi useri ce pot avea următoarele roluri:administrator,profesor,student.Acesta are la îndemână două posibilități de a crea noi useri:în mod manual sau prin invitație.
Figură 9-Butoane
Modul manual de introducere
Odată ce administratorul apasă butonul ”New User” va apărea un formular cu datele user-ului ce urmează a fi creat.Acesta va trebui să completeze următoarele câmpuri:numele,adresa de e-mail,parola,confirmarea parolei și rolul .
Figură 10-Formular de creare user în mod manual
În urma completării formularului și trimiterea informațiilor către server pot apărea următoarele mesaje:
email has already been taken – apare atunci când email-ul introdus există în baza de date. Asta înseamnă că niciun alt utilizator nu poate avea același email;
is too short (minimum is 8 characters) – pentru a fi acceptată, o parolă trebuie să aibă între 8 și 255 de caractere. Altfel, apare acest mesaj de eroare;
doesn`t match Password – parola introdusă inițial nu se potrivește cu noua parolă introdusă
2) Modul prin invitație
Odată ce administratorul apasă butonul ”Invite” va apărea un formular cu datele user-ului ce urmează a fi creat.Acesta va trebui să completeze următoarele câmpuri:e-mail,nume și rol .
Figură 11-Formular de creare user prin invitație
În urma completării formularului și trimiterea informațiilor către server pot apărea următoarele mesaje:
e-mail is invalid – formatul e-mailului nu este unul permis
e-mail has already beeen taken- apare atunci când email-ul introdus există în baza de date. Asta înseamnă că niciun alt utilizator nu poate avea același email;
Acceptarea invitației
În momentul în care un user primește o invitație pe e-mail acestuia i se pune la dispoziție link-ul către adresa la care se găsește platforma.
Figură 12- Invitația primită pe e-mail
În momentul în care acesta va apăsa pe link-ul ”Accept invitation” va fi redirecționat către o pagină în care își va putea seta o parolă aleasă de el,diferită de cea introdusă de administrator.
Figură 13-Setarea unei noi parole
Acesta va trebui să introducă o parolă de minim 8 caractere cât și repetarea acesteia.După ce va apăsa butonul ”Set my password” parola sa se va modifica,acesta urmând să poată folosi aplicația.
În pagina Users sunt afișați toți utilizatorii din sistem.Singura persoană care poate efectua modificări asupra acestora este administratorul.Acesta poate edita informațiile despre toți ceilalți useri din sistem ( le poate modifica numele,adresa de e-mail și rolul).Administratorul are posibilitatea de a șterge userii din sistem.
Figură 14-Pagina cu useri
Figură 15-Editarea informațiilor unui user
În pagina Study Years administratorul va putea sa creeze un nou an de studiu.Acesta va trebui să dea un nume noului an de studiu și data de începere al anului respectiv.Va avea la dispoziție o listă de selecție din care va putea selecta anul,luna și ziua.După ce va apăsa butonul ”Create Study year” un nou an de studiu va fi afișat.
Figură 16-Crearea unui nou an de studiu
Administratorul va avea posibilitatea de a adăuga departamente la anul de studiu respectiv,de a adăuga cursuri la departamente .După aceasta urmează să adauge profesorii la cursurile la care aceștia predau cât și studenții.Un curs poate avea mai mulți profesori dar și studenți.Un profesor poate preda mai multe cursuri,iar un student poate participa la mai multe cursuri.
Figură 17-Adăugarea cursurilor,profesorilor și studenților
Administratorul poate elimina profesorii și studenții de la un curs,poate șterge un curs creat,departament sau an de studiu.
3.2.4 Rolul de profesor
În momentul în care un profesor se loghează în aplicație acesta va primi notificări din care va afla la ce curs a fost adăugat de către administrator.
Atunci când un profesor s-a conectat la platformă,acesta va avea posibilitatea de a putea vedea cursurile la care a fost repartizat de către administrator,adică la acelea la care predă.Un profesor nu va putea avea accesul la cursurile ce nu sunt predate de el.
Figură 18-Cursurile predate de către profesor
După ce acesta va intra la unul din cursurile la care predă ,va avea posibilitatea de a adăuga materialele aferente cursului respectiv (seminarii,laboratoare).Va putea uploada orice tip de document.Acesta are posibilitatea de a comenta la fiecare document ce a fost încărcat împreună cu studenții de la cursul respectiv,realizându-se astfel o mai bună înțelegere a ceea ce trebuie învățat și lucrat.De asemenea,profesorul poate șterge capitolul creat atunci când acesta nu mai prezintă interes studenților.
Figură 19-Crearea de capitole
Figură 20-Adăugarea de documente la curs
La secțiunea ”Grades” profesorul trebuie să acorde nota finală tuturor studenților de la cursul respectiv,după sesiunea de examene.
Figură 21-Tabel cu notele fiecărui student
3.2.5 Rolul de student
În momentul în care un student se loghează în aplicație acesta va primi notificări din care va afla la ce curs a fost adăugat de către administrator.Va avea posibilitatea de a deschide pentru a citi toate materialele adăugate de profesor la cursul respectiv dar și de a comenta împreună cu ceilalți studenți și cu profesorul de la curs despre lecțiile atașate,note,examene.Studenții pot vedea ce notă au obținut la examen la materia respectivă .Nota studentului în cauză va fi afișată în mod distinct față de notele celorlalți colegi,aceasta fiind marcată de o culoare (verde în cazul de față) .
Figură 22-Tabel cu nota studentului logat
3.3 Structură
3.3.1 Descriere
Aplicația care face obiectul acestei lucrări folosește paradigma de programare MVC
prin utilizarea framework-ului Ruby on Rails.Prin folosirea unui astfel de model de programare se economisește timp pentru crearea unei aplicații web,se asigură o bună organizare a acestuia prin separarea lui în componente reutilizabile,se facilitează procesul de analiză a codului.
3.3.2 Controller-e
Aplicația conține mai multe controller-e dintre care un controller principal și anume controller-ul părinte,ActionController.Acesta apare în toate aplicațiile ce folosesc framework-ul de programare Ruby on Rails.Toate celelalte controller-e moștenesc în mod direct sau indirect acest controller.Controllerel-e principale din aplicație sunt următoarele: ApplicationController,AdminController.Controllerel-e ce moștenesc AdminController sunt după cum urmează:
CoursesController,DepartmentsController,StudyYearsController,UsersController.Cele ce moștenesc ApplicationController sunt:ChaptersController,CommentsController,
CoursesController,MessagesController,StudentGradesController.Fiecare controller conține una sau mai multe metode.
ensure_admin
Această metodă este folosită pentru a se asigura că orice utilizator în afară de admin nu poate să efectueze modificări asupra structurii platformei de e-learning.Pentru ca aplicația să poată funcționa trebuie să existe măcar un admin.Dacă oricare alt utilizator va încerca să acceseze părți ale aplicației la care acesta nu are acces ,acestuia i se va afișa un mesaj de avertizare ca ”Permission Denied” iar acesta va fi redirecționat către root_path.
Controllerel-e CoursesController,DepartmentsController,StudyYearsController și
UsersController conțin metode ce specifice noțiunii de CRUD(create,read,update,delete).
Dintre acestea specificăm următoarele:index,new,create,edit,update,destroy.
CRUD
CRUD ( create,read,update,delete) reprezintă funcționalitățile de bază folosite pentru a crea obiecte,a citi aceste obiecte,a updata datele din obicte și pentru a le șterge.În aplicațiile ce folosesc baze de date acronimul CRUD se referă la toate funcțiile importante ce sunt implementate în bazele de date relaționale.Fiecare literă din acronim poate mapa un standard SQL,o metodă HTTP sau o operație DDS.Pentru SQL se folosește (INSERT,SELECT,
UPDATE,DELETE),pentru HTTP se folosește (PUT/POST,GET,PUT/PATCH,DELETE) iar pentru DDS (write,read/take,write,dispose).
3.3.3 Servicii
DEVISE
Devise este un mecanism de autentificare folosit de Rails.Acesta este compus din zece module:
Database Authenticatable – criptează și memorează parole în baza de date pentru a valida unicitatea unui user atunci când acesta se loghează.Autentificarea se poate realiza cu ajutorul unui request POST sau HTTP
Omniauthable – adaugă suport pentru OmniAuth.OmniAuth este o librărie ce standardizează autentificarea mai multor utilizatori în aplicațiile web
Confirmable – trimite e-mailuri cu confirmarea instrucțiunilor și verifică dacă un cont a fost confirmat în timpul autentificării
Recoverable – resetează parola utilizatorilor și le trimite acestori instrucțiunile de resetare
Registerable – reține utilizatorii logați în procesul de autentificare, permițându-le să-și editeze și să-si distrugă conturile
Rememberable – este folosit pentru ca utilizatorii să nu mai fie nevoiți să introducă datele de autentificare de fiecare dată
Trackable – memorează numărul de autentificări și adresele IP (Internet Protocol)
Timeoutable – distruge sesiunile ce nu au fost active o anumită perioadă de timp ce a fost specificată
Validatable – este folosită pentru validarea adresei de e-mail și a parolelor
Lockable – blochează conturile după un anumit număr de încercări de logare nereușite,ele putând fi deblocate după o anumită perioadă de timp
Pentru a instala devise trebuie:
adăugată în lista de gem-uri – gem ’devise’ și să se execute comanda ”bundle”trebuie rulat generatorul ”rails generate devise:install”;acesta va instala inițializator ce va conține toate opțiunile de configurare trebuie rulată comanda ”rails generate devise MODEL” pentru a adăuga devise la toate modelele unei aplicații trebuie setate opțiunile pentru URL-ul (Uniform Resource Locator) adreselor de e-mail.
Exemplu:
config.action_mailer.default_url_options=
={host:’localhost’, port:3000 }
Pasul final este reprezentat de restartarea aplicației după ce au fost efectuate schimbările
de configurare .
CARRIER WAVE
Acesta furnizează un mod simplu de a uploada fișiere în aplicațiile ce folosesc Ruby on Rails.Pentru a instala acest gemfile trebuie rulată comanda ”gem install carrierwave”,iar acesta trebuie mutat în fișierul ce conține lista de gemfile-uri.Pentru ca schimbările să poată fi sesizate va trebui ca serverul să fie restartat.CarrierWave folosește un loc numit ”store” pentru memoria permanentă și un loc numit ”cache” pentru memoria temporară.Se pot folosi diferite tipuri de memorare incluzând fișiere din sistem și memorie Cloud.Acesta se folosește intr-o foarte mare măsură împreună cu un ORM (Object-Relational Mapping). Înainte să fie adăugat CarrierWave-ul ,va trebuie să fie adăugat ORM-ul,altfel va trebui adăugată în mod manual extensia potrivită.
Exemplu:
require ”carrierwave/orm/activerecord”
CANCAN
Cancan este o librărie de autorizare pentru Ruby on Rails care are rolul de a restricționa resursele pe care un user are permisiunea să le acceseze.Toate permisiunile sunt definite într-o singură locație și anume în clasa Ability ,toate acestea nefiind duplicate în controlere,view-uri și interogări ale bazei de date.
Acesta poate fi instalat în două moduri.Un mod este prin adăugarea acestuia în fișierul ce conține gem-urile aplicației iar un al doilea mod este prin instalarea acestuia prin intermediul unui plugin : rails plugin install git://github.com/ryanb/cancan.git.
Permisiunile unui user pot fi verificate folosind metodele can? Și cannot? în view și controller.Metoda authorize! din controller va lansa o excepție dacă userul nu este capabil să execute acțiunile date.
3.3.4 Rute
Fiecare controller-ele de mai sus are asociată o rută. Atunci când se face referire la o anumită rută se invocă și metoda corespunzătoare. În continuare vom lista rutele și metodele asociate acestora:
index (path: ”app/users/sign_in”);
index (path: ”app/admin/study_years”);
edit (path : ”app/admin/study_years/1/edit”);
new (path: ”app/admin/study_years/new”);
index (path: ”app/admin/users”);
new (path: ”app/users/invitation/new”);
new (path: ”app/admin/study_years/4/departments/new”);
index (path: ”app/admin/study_years/4/departments”);
edit (path: ”app/admin/study_years/4/departments/7/edit”);
new (path: ”app/admin/users/new”);
index (path:”app/courses/1/chapters”);
index (path:”app/courses/1/student_grades”);
3.3.5 Diagrama bazei de date
Diagrama unei baze de date are rolul de a afișa modelele ce există într-o bază de date
împreună cu relațiile dintre ele.Fiecare model reprezintă un tabel din baza de date împreună cu câmpurile acestuia.
Figură 23-Diagrama bazei de date
4 Concluzii
Scopul acestei lucrări de licență a fost crearea unei platforme de e-learning de tip moodle destinată studenților,profesorilor,tuturor instituțiilor de învățământ din mediul universitar.Astfel am reușit crearea unei platforme de e-learning ce este utilă atât pentru profesori cât și pentru studenți ,oferind un cadru de interacțiune.Aplicația permite crearea diferitelor clase de utilizatori,fiecare dintre acestea având niveluri de acces și permisiuni diferite.Principalul rol într-o astfel de platformă îl are administratorul acestuia revenindui atribuțiile de a organiza aplicația pe ani de studiu,departamente,cursuri.El distribuie toți studenții și profesorii la cursuri.Funționalitatea unei astfel de platforme este foarte importantă întrucât are rolul de a stoca și de a analiza informațiile referitoare la performanțele elevilor.
Procesul de dezvoltare al platformei de tip e-learning s-a realizat pe un sistem de operare de tip UNIX și anume Ubuntu Linux ,iar ca mediu integrat de dezvoltare s-a folosit RubyMine de la JetBrains.Pentru baza de date a fost ales un server MySQL.
Aplicația este împărțită în două componente:partea de server și partea de client.
Pe partea de server s-au folosit tehnologiile Ruby,eRuby,framework-ul Rails ce se bazează pe paradigma de dezvoltare model-view-controller. Pe partea de client s-au folosit tehnologiile JavaScript,librăria jQuery și Ajax,Bootstrap. O mare parte din comunicarea cu server-ul se realizează prin cereri asincrone efectuate cu ajutorul tehnicilor AJAX pentru eficientizarea procesului de navigare prin schimbarea de conținut în mod dinamic. Mecanismul de autentificare se realizează prin intermediul unui concept folosit de către ruby și anume Devise.Pentru a uploada documente s-a folosit de asemenea un mecanism (tool) folosit de ruby cunoscut ca CarrierWaveUploader.
Prin utilizarea tehnicilor de design Bootstrap am reușit crearea unei interfețe prietenoase, intuitive, ușor de gestionat și navigat pentru orice utilizator.
În viitor,această aplicație se poate dezvolta,o direcție fiind posibilitatea implementării unui sistem de comunicare real-time ,de tip chat sau unui forum de discuții.De asemenea,o altă direcție de dezvoltare ar fi implementarea unui sistem de monitorizare a prezenței la cursuri dar și a unui sistem de videoconferințe în care profesorii pot preda cursuri.
În concluzie, prin folosirea unor tehnici și tehnologii noi și rapide,am reușit realizarea unei platforme de e-learning de tip moodle,ce poate fi utilizată de către toate instituțiile de învățământ în cadrul procesului de învățare la distanță.Astfel persoanele ce nu pot participa la cursuri,seminarii, au ocazia de a accesa și învăța cursurile pierdute.O astfel de platformă reprezintă o unealtă ce are rolul de a îmbunătăți procesele educaționale.
5 Bibliografie
Tabel de figuri
Figură 1-Fluxul de procesare a unei cereri 13
Figură 2-Partea din stânga meniului 34
Figură 3-Partea din dreapta meniului 35
Figură 4-Opțiunea de delogare 35
Figură 5-Opțiunea de schimbare a prolei 35
Figură 6-Formularul de logare 36
Figură 7-Mesaj de succes 36
Figură 8-Mesaj de avertizare 37
Figură 9-Butoane 37
Figură 10-Formular de creare user în mod manual 37
Figură 11-Formular de creare user prin invitație 38
Figură 12- Invitația primită pe e-mail 39
Figură 13-Setarea unei noi parole 39
Figură 14-Pagina cu useri 40
Figură 15-Editarea informațiilor unui user 40
Figură 16-Crearea unui nou an de studiu 41
Figură 17-Adăugarea cursurilor,profesorilor și studenților 41
Figură 18-Cursurile predate de către profesor 42
Figură 19-Crearea de capitole 42
Figură 20-Adăugarea de documente la curs 43
Figură 21-Tabel cu notele fiecărui student 43
Figură 23-Diagrama bazei de date 48
5 Bibliografie
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Implementarea Unui Sistem Informatic In Ruby On Rails (ID: 149894)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
