Įžanga

Darbo įrankiai ir aplinka

Kadangi vienastoks visa tai pavadino ‘girtu projektu’, tai prisilaikydamas šios linijos, atsikemšu butelį alaus ir pradedu darbą:)
Be aš dar pasinaudosiu:

Jei kas pradedate programuoti su ir dar neišbandėte RadRails, tikrai siūlau tai padaryti. Labai patogus, gerai atrodantis IDE. Jis taip pat jums labai aiškiai sužymės sintaksę, pasakys kur klaida, sudės funkcijų užbaigimo žymas ir pan. Vienas nedidelis trūkumas, tai kad RadRails suprogramuotas su Java ir sunaudoja nemažai kompiuterio resursų. Jam nieko nereiškia savo reikmėms pasiimti 500 MB RAM ar daugiau.

Visi šie įrankiai yra nemokami, išskyrus Navicat. Beje, RadRails taip pat turi integruotą SQL klientą, kuriuo, mano nuomone, nėra labai patogu naudotis. Tačiau turime phpMyAdmin ir pan.

Mano OS - Windows XP. Nors visa tai galite naudoti tiek Linux OS, tiek ir MacOS. Tik girdėjau, kad obuoliai programuodami su naudoja Lokomotyvą ir labai gerą tekstinį redaktorių TextMate (gaila, kad nėra išleistos jo versijos Windows ar Linux OS, nes iš momentinių ekrano kopijų (angl. screenshot) ir aprašymų jis labai patraukliai atrodo).

2.0.2

Kol aš rašiau įžangą kaip lengva programuoti su , spėjo išeiti nauja 2.0 versija. Ir dabar ne viskas veikia, kas veikdavo pirmojoje versijoje.

Praeitų metų gruodžio mėnesį buvo išleista nauja 2.0 versija, kurios aš anksčiau nebuvau bandęs, todėl man teks mokytis ir atrasti skirtumus tarp 2.X ir 1.X versijų kartu su Jumis. :)

Kuriame naują projektą

Skirtumai tarp 1.X ir 2.X versijų prasideda nuo pat projekto kūrimo pradžios. Anksčiau kaip pagrindinę duomenų bazę naudodavo MySQL, tačiau nuo antros versijos pagrindinė (angl. default) duomenų bazė yra SQLite3. Tiesą pasakius anksčiau neteko apie ją girdėti, bet kaip suprantu tai “lengvas” duomenų bazės varikliukas (angl. database engine) ir plačiai naudojamas mobiliųjų įrenginių aplikacijoms kurti.

Jei kursime naują projektą standartine 1.x versijos komanda rails StatauAlaus mums bus sugeneruotas projektas naudosiantis SQLite3 duomenų bazę. Kadangi savo projekte naudosiu MySQL serverį, tad šiai komandai 2.X versijoje reikia papildomo parametro -d mysql

Sukuriame naują projektą (komandinėje eilutėje su cd nukeliaujame ten, kur bus saugomi mūsų projekto failai, pvz. cd c:\projektai) ir įvykdome komandą:

rails -d mysql StatauAlaus

Jei naudojate RadRails:

File->New project->Rails Project

Įvedame projekto pavadinimą, pavyzdžiui, StatauAlaus. Paliekame programos pasiūlytus pasirinkimus - sukurti Rails aplikacijos skeletą bei WEBrick serverį. Tačiau ši komanda sukurs projektą su SQLite3 nustatymais, todėl teks paredaguoti config/database.yml failą, kad būtų naudojamas MySQL.

Susikonfigūruojame plėtojamą (angl. development) duomenų bazę (kol kas test ir production nustatymų neliečiu), paredaguodamas config/database.yml failą:

development:
adapter: mysql
encoding: utf8
database: alus
username: admin
password:xxx
host: localhost

Savo kompiuteryje pasileidžiu MySQL ir sukuriu naują MySQL duomenų bazę alus.

Pirmas uždavinys

Kadangi mūsų projektui bus reikalinga vartotojų registracija, tai logiška būtų aplikacijos kūrimą pradėti nuo jos. Nes visi veiksmai (informacijos įvedimas) bus atliekami tik registruotų vartotojų, o neregistruoti tik galės peržiūrėti duomenų bazėje sukurtą informaciją.

Kadangi mes visi čia mokomės programuoti, tai norėčiau pradėti nuo kažko paprastesnio ir įdomesnio. Manau, visų pirma vertingiau išsiaiškinti pagrindus, o vėliau prieiti prie sudėtingesnių dalykų. Vėliau papildysim kodą, kad tam tikrus veiksmus galėtų atlikti tik registruoti arba atitinkamas teises turintys vartotojai.

Tad pradžiai sukursiu paprastą vartotojų lentelę su keliais laukais bei jos valdymo funkcionalumą.

Scaffolding’as

Jei norite draugus nustebinti savo programavimo greičiu, pasinaudokite Scaffold skriptu, kuris visą reikalingą kodą parašys už jus. Praktikoje šis dalykas naudojamas retokai, bet mokslo tikslais tikrai jį verta išbandyti.

Antrojoje versijoje kiek pasikeitė Scaffoldingo sintaksė - jei v1.X reikėdavo nurodyti Modelio bei Kontrolerio pavadinimus (apie modelius ir kontrolerius skaitome čia), tai v2.0 užtenka nurodyti tik Modelio pavadinimą, bet papildomai reikia nurodyti generuojamus laukus ir jų tipus.

Komandinėje eilutėje rašome:

 script/generate scaffold User login:string realname:string desc:text birthday:date

Jei norime, kad mums sukurtų ir db lentelę, paleidžiame šį migravimo skriptą:

rake db:migrate

(Paprastai savo mėgėjiškuose projektuose migravimo funkcionalumu nesinaudoju, nes nelabai išmanau kaip jis tiksliai veikia. Kiek suprantu tai labai naudingas dalykas sinchronizuojantis plėtojimo (angl. development), testavimo (angl. testing) ir production aplinkas. Tad kol kas visas migracijas tarp development ir production versijų atlieku per ftp (kodo) ir SQL skriptus (duomenų bazės struktūros atnaujinimai). Tad jei kas galėtų aiškiai ir paprastai aprašyti migravimus Rails’uose, su dideliu susidomėjimu paskaityčiau).

Štai ir viskas. Jau turime pilnai veikiančią aplikaciją - galime įvesti naujus duomenis, juos redaguoti arba ištrinti. Ir visa tai neparašius nei vienos programinio kodo eilutės, o tik paleidus keletą skriptų.

Pasileidžiame web serverį ir žiūrime:

(http://ror1.vaizdelis.lt/)

Aišku funkcionalumas labai paprastas, bet pradedančiajam mėgėjui programuotojui tai tikrai padaro nemažą įspūdį ir uždega norą dar giliau domėtis .

Gem’ai ir pluginai (įskiepiai)

yra nuostabus ne tik tuo, kad kodo rašymas yra nesudėtingas, bet turi ir puikią bendruomenę, kuri yra sukūrusi begalę įskiepių (angl. plugins), kuriuos galime naudoti savo projektuose. Tai lyg paruoštos bibliotekos tam tikroms funkcijoms atlikti, pavyzdžiui, vartotojų registracijai, failų siuntimui, grafinių failų apdorojimui ir pan. Šie įskiepiai labai stipriai palengvina programuotojo darbą. Jei norite sukurti apsaugą nuo šiukšlintojų - Captcha, jums tereikia įdiegti atitinkamą įskiepį ir įrašyti kelias kodo eilutes ir iš karto viskas veikia.
O jeigu reikėtų pačiam suprogramuoti visą captcha funkcionalumą? Pavyzdžiui, aš to net apskritai nesugebėčiau padaryti. Tad savo projekte pasinaudosime ne vienu populiariu įskiepiu.

Kuo skiriasi gem nuo plugin? - Jei trumpai, tai įdiegus serveryje GEM, jį bus galima naudoti visuose projektuose. O įskiepius (angl. pluginus) reikia diegti kiekvienam projektui atskirai.

Tik bėda tame, kad nemaža dalis įskiepių yra neatnaujinti ir nesuderinami su 2.x versija.

Pradedame kurti savo aplikaciją

Vėl nuo komentatorių gausiu per kuprą, kad vien tik pilstau, o nieko praktiško nedarau. Na, toliau stengsiuosi mažiau pilstyti.

Ta proga prisiminiau vieną anekdotą kaip Petriukas biologijos egzaminą laikė mokėdamas tik vieną temą apie dramblius. Egzamino metu jis ištraukė bilietą su klausimu apie skruzdes. Tad jis ir sako, skruzdės visai nepanašios į dramblius, o va drambliai tai … (ir sekė ilgas pasakojimas apie dramblius).
Panašiai elgiuosi ir aš. :)

Tad galų gale pradedam (Vartotojų lentelė ir jų registracija)

Duomenų bazėje susikuriu lentelę users (naudosiu angliškus kintamųjų bei funkcijų pavadinimus, nes taip atsiskleis tikrasis grožis).

CREATE TABLE `users` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`login` VARCHAR(20) NOT NULL,
`password` VARCHAR(40) NOT NULL,
`real_name` VARCHAR(40) DEFAULT NULL,
`desc` TEXT,
`created_at` DATETIME NOT NULL,
`updated_at` DATETIME NOT NULL,
PRIMARY KEY  (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

Kuriant lenteles aplikacijoms svarbu, kad lentelė turėtų id lauką. Laukai created_at ir updated_at bus užpildomi automatiškai sukuriant ar atnaujinant įrašą. Jokio kodo jų valdymui rašyti nereikės. Tai taip vadinami magic fields. Daugiau apie šiuos laukus pasiskaitykite http://wiki.rubyonrails.org/rails/pages/MagicFieldNames

Atkreipkite dėmesį, kad lentelės pavadinimas yra daugiskaita users, nes jame bus saugoma daug vartotojų (angl. users). Jeigu lentelėje saugotumėte informaciją apie prekes (angl. good) ar, pavyzdžiui, gyvūnus (angl. animal), tai lentelės pavadinimai turėtų būti šių žodžių daugiskaita, atitinkamai goods ir animals. Logiška, jei lentelės įrašuose saugoma informacija apie daug gyvūnų, tai ir pavadiname ją “gyvūnai”.

ne tik žino, kad anglų kalboje daugelis žodžių daugiskaitoje baigiasi “s” raide, bet ir žino kurie turi kitokias formas. Pavyzdžiui, city, daugiskaita yra cities ir veiks korektiškai tik jei lentelę pavadinsite “cities”. Jei manysite, kad yra kvailas ir pakišite jam “citys” - nesupras, kad informacija apie city yra saugoma citys lentelėje.

Atsiminkite, ką sakiau šių straipsnių serijos įžangoje, kad reikia mokėti ne matematiką, o gramatiką. :) Tai dar nėra visas rails’ų grožis. Pabandykite sukurti lentelę, kurioje būtų saugoma informacija apie asmenis (angl. person). Manote, lentelės pavadinimas turi būti “persons”? Vat ir ne, taip niekas neveiks. Jei objekto pavadinimas yra person, tai rails’ai tikėsis, kad lentelės pavadinimas bus “people”. Jeigu objektas mouse, tai lentelė mice. Aišku tokie dalykai dažnai nepadeda pradedančiajam, o atvirkščiai - rauniesi plaukus nesuprasdamas kodėl neveikia, nors viskas lyg ir teisingai surašyta.

Vartotojų registracija

Visada vartotojų registracijai naudodavau Login_generator gem’ą, kuris sugeneruodavo praktiškai visą reikalingą kodą vartotojų registracijai bei prisijungimams valdyti. Tačiau įdiegus jį į 2.x versijos projektą, pasirodė, kad jis neveikia. Pabandžiau paieškoti internete ar yra išleista jo nauja versija, bet radau informacijos kad šis gem’as nebebus atnaujinamas.

Tad vartotojų registracijos funkcionalumo sukūrimą atidėsiu vėlesniam laikui (paieškosiu kitų įskiepių arba pasiskaitęs mokomąsias medžiagas (angl. tutorials) pabandysiu sukurti savo).

Kadangi tolimesniam funkcionalumui bus reikalingas tikrinimas ar vartotojas yra prisijungęs prie sistemos ar ne, tad tiesiai į duomenų bazės users lentelę įvedu porą testinių vartotojų.

Vartotojo informacijos valdymas

Norint keisti duomenų bazėje išsaugotą informaciją, turime susikurti modelį, kontrolerį bei vaizdus (angl. views) šios informacijos valdymui.

Sukuriu modelį User:

 script/generate model User

Sukuriu kontrolerį User:

 script/generate controller User

Vartotojo prisijungimas:

User kontroleryje /controllers/user_controller.rb sukuriu du metodus Login ir Logout (jie vėliau bus pakeisti normaliu autentifikacijos mechanizmu, o dabar bet kuris vartotojas, atidaręs nuorodą http://localhost:3000/user/login bus prijungtas kaip vartotojas su ID 1)

def login
 
session['uid'] = 1
#po sėkmingo prisijungimo jis nukreipiamas į my_details puslapį
redirect_to :action=>'my_details'
 
end

Išsiregistruojant, session[’uid’] priskiriama null reikšmė

def logout
 
session['uid'] = nil
 
end

Dabar sukursiu vartotojo nustatymų puslapį, kuriame jis galės keisti informaciją apie save.

Tad User kontroleryje sukuriu naują metodą my_details:

def my_details
 
if session['uid']
 
@user = User.find(session['uid'])
 
else
 
@user = nil
 
end
 
end
 
end

Sukuriu naują vaizdą views/user/my_details.rhtml (tiesiog sukuriu naują tekstinį failą my_details.rhtml)

Pirma patikrinu ar vartotojas prisijungęs. “h” helperis pašalina html tagus iš teksto.

<h3>Vartotojo nustatymai</h3>
 
<%if @user-%>
Vartotojas: <%=@user.login%> <br />
Tikras vardas: <%=h(@user.real_name)%> <br />
Aprašymas: <%=h(@user.desc)%> <br />
<%=link_to 'Keisti informaciją', :action=>'edit'%>
<%else-%>
Tamsta esat neprisijungęs...
<%end-%>

Naršyklėje atsidarau http://localhost:3000/user/login - tai mane prijungia kaip vartotoją su ID1 ir nukreipia į http://localhost:3000/user/my_details. Matau tokį vaizdelį:

<h3>Vartotojo nustatymai</h3>
Vartotojas: tomas
Tikras vardas:
Aprašymas:

Vadinasi sistema mane atpažįsta kaip prisijungusį ‘tomas’ vartotoją.

Vartotojo informacijos redagavimas

Į my_details vaizdą įkeliu nuorodą į informacijos redagavimo formą

<%=link_to 'Keisti informaciją', :action=>'edit'%>

Sukuriu naują vaizdą /views/user/edit.rhtml

<%=form_tag :action=>'edit'%>
Tikras vardas: <%= text_field "user", "real_name"%><br />
Aprašymas: <%= text_area "user", "desc", :rows=>4 %>
<br />
<%= submit_tag "Išsaugoti" %>
</form>

User kontroleryje pridedu papildomą metodą ‘edit’

def edit
 
case request.method #priklaudomai nuo to ar atidarome formą :get, ar siunčiam atnaujintą informaciją :post bus vykdomas skirtingas kodas
 
when :get #jei atidarome forma, tai tik surandame prisijungusį vartotoją
 
@user = User.find(session['uid'])
 
when :post
 
#@user objektui priskiriame prisijungusio vartotojo id
 
@user = User.find(session['uid'])
@user.id = User.find(session['uid']) #dėl viso pikto @user objektui priskiriu prisijungusiu vartotojo ID, kad koks negeras žmogus neperduotų šio ID su parametru.
 
if @user.update_attributes(params[:user])
 
flash[:notice] = 'Informacija atnaujinta.'
redirect_to :action =&gt; 'my_details'
 
else
 
flash[:notice] = 'Klaida.'
render :action =&gt; 'edit'
 
end
 
end
end

Na, jau mūsų vartotojas gali atnaujinti savo pagrindinius nustatymus - tikrą vardą ir aprašymą.

Būtų neblogai matyti ir visus registruotus vartotojus.

Vartotojų sąrašas

Paprasčiausia vartotojų sąrašą būtu išsitraukti @users = User.find(:all). Ši funkcija iš duomenų bazės ištrauktų visus registruotus vartotojus. Bet jų gali būti labai daug ir visus atvaizduoti viename puslapyje nelabai racionalu. Todėl turime šį sąrašiuką supuslapiuoti.

1.x versijoje buvo standartinis ‘paginate’ helperis, kuris tą darbą už mus atlikdavo. Kadangi ši funkcija nebuvo labai efektyvi bei funkcionali, 2.x versijoje ji buvo panaikinta. Kiek teko skaityti, tai dabar vietoj jos rekomenduojama naudoti įskiepį will_paginate. Taigi jį ir įdiegsime:

 script/plugin install will_paginate

User kontroleryje sukuriu metodą ‘list’

def list
 
@users = User.paginate(:page=&gt;params[:page], :per_page=&gt;20, :order=&gt;'created_at desc')
 
end

Sukuriu vaizdą ‘views/user/list.rhtml

<%for user in @users-%>
 
<%=link_to user.login, :controller=>'user', :action=>'show', :id=>user.id%> <%=h(user.real_name)%><br />
 
<%end-%>
 
<%=will_paginate @users%>

Žiūriu ką turiu http://localhost:3000/user/list

romas Romas Ramanauskas
tomas Tomas Aleksiejūnas

Kai vartotojų bus daugiau negu 20, apačioje atsiras puslapiavimo nuorodos.

Vartotojo peržiūra

Kol kas galime peržiūrėti tik savo informaciją. Bet mus labiau domina ką apie save rašo kiti vartotojai.

User kontroleryje sukuriame metodą ’show’

def show
 
@user = User.find(params[:id])
 
end

Sukuriame vaizdą show.rhtml

Vartotojas: <%=@user.login%><br />
Tikras vardas: <%=h(@user.real_name)%><br />
Aprašymas: <%=h(@user.desc)%><br />

Alaus statymai

Laikas pereiti prie pagrindinio funkcionalumo, t.y suteikti vartotojams galimybę pastatyti vienas kitam alaus.

Sukuriu alaus statymų lentelę cheers (ilgai galvojau kaip tai pavadinti angliškai, bet nieko geriau neatėjo į galvą. Kadangi angliškai cheers reikškia ‘į sveikatą’, tai tegu taip ir vadinasi)

CREATE TABLE `cheers` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`giver_id` INT(11) NOT NULL,
`receiver_id` INT(11) NOT NULL,
`receiver_email` VARCHAR(50) DEFAULT NULL,
`desc` TEXT NOT NULL,
`is_settled` INT(1) NOT NULL DEFAULT '0',
`created_at` DATETIME NOT NULL,
`updated_at` DATETIME NOT NULL,
PRIMARY KEY  (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

Sukuriu Cheer modelį

 script/generate model Cheer

Sukuriu Cheer kontrolerį

 script/generate controller Cheer

Pastatyti alaus galima bus ne tik registruotam vartotojui, bet ir el. paštu neregistruotam vartotojui. Taip pat mums reikės patikrinti, ar tokiu el. paštu dar nėra registruoto vartotojo. Kadangi dar neturime el. pašto adresų valdymo funkcionalumo, tai pradžiai susikursime tik emails lentelę:

CREATE TABLE `emails` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`user_id` INT(11) NOT NULL,
`email` VARCHAR(50) NOT NULL,
`created_at` DATETIME NOT NULL,
PRIMARY KEY  (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

patį el. pašto adresų valdymo funkcionalumą susikursime kiek vėliau. Šiam etapui mums užteks ir lentelės bei Email modelio.

Susikuriu modelį Email

  script/generate model Email

Pastatykim alaus el. paštu

Cheer kontroleryje sukuriu naują metodą ‘new_beer_by_email

def new_beer_by_email
@cheer = Cheer.new
end

Sukuriu naują vaizdą ‘new_beer_by_email’ ir formą naujo statymo įvedimui. Pirma dar patikrinu ar vartotojas priijungęs. Jei išsaugojama informacija nepraeis validacijos, tai klaidas parodys: error_messages_for

<%= error_messages_for 'cheer' %>
<%if session['uid']-%>
<%= form_tag :controller=>'cheer', :action => "create_beer_by_email"%>
 
Alaus gavėjo el. paštas: <%= text_field "cheer", "receiver_email", :size=>30,  :value=>params[:email]%><br />
Už ką:<br />    <%= text_area "cheer","desc", :rows=>4%> <br />
 
<%= submit_tag 'Pastatyti alaus' %>
</form>
<%else-%>
Brolyti, pirma reikia prisijungti...
<%end-%>

Beje, jei nuorodoje bus nurodytas parametras email, jis automatiškai atsiras formoje (pvz. : new_beer_by_email?email=tomas@xxx.lt)

Cheer kontroleryje sukuriu metodą ‘create_beer_by_email

def create_beer_by_email
 
@cheer = Cheer.new(params[:cheer])
@cheer.giver_id = session['uid']
 
#Ieškau ar yra registruotas vartotojas su tokiu emailu. Į email lentelę pateks tik patvirtinti registruotų vartotojų el. pašto adresai.
#Jei emailą radau, priskiriu user_id, jei ne, tai priskiriu 0
if @email = Email.find_by_email(params[:cheer][:receiver_email])
@cheer.receiver_id = @email.user_id
else
@cheer.receiver_id = 0
end
 
# Išsaugoju naują statymą
 
if @cheer.save
flash[:notice] = 'Alus pastatytas.'
redirect_to :action =&gt; 'list'
else
flash[:notice] = 'Klaida.'
render :action =&gt; 'new_beer_by_email'
end
 
end

Kad vartotojas negalėtų išsaugoti statymų be el. pašto ar aprašo, Cheer modelyje models/cheer.rb sukuriu validationus (patikrinimus)

class Cheer > ActiveRecord::Base
 
validates_presence_of :receiver_email, :on => :create
validates_format_of :receiver_email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, :on => :create
validates_presence_of :desc, :on => :create
 
end

Po sėkmingo statymo, vartotojas nukreipiamas į ‘list’ metodą. Jo kol kas nėra, tad sukurkime:

Cheers kontroleryje:

def list
 
@cheers = Cheer.paginate(:page=&gt;params[:page], :per_page=&gt;20, :order=&gt;'created_at desc')
 
end

Taip pas sukuriu vaizdą /views/cheer/list.rhtml alaus statymų atvaizdavimui

<%for cheer in @cheers-%>
 
<%=link_to User.find(cheer.giver_id).login, :controller=>'user', :action=>'show', :id=>cheer.giver_id%> pastatė
 
<%if cheer.receiver_id != 0-%>
<%=link_to User.find(cheer.receiver_id).login, :controller=>'user', :action=>'show', :id=>cheer.receiver_id%>
<%else-%>
<%=cheer.receiver_email%>
<%end-%>
 
alaus <br />
 
<%=h(cheer.desc)%><br />
 
<%end-%>
 
<%=will_paginate @cheers%>

Jau galime pastatyti alaus neregistruotam vartotojui el. paštu, bet negalime registruotam. Reikia ištaisyti šį trūkumą.

Alaus statymas registruotam vartotojui

Kadangi kuriame web2.0 projektą, tai nori nenori mums reikia panaudoti . Aš šią technologiją suprantu taip - tai visokios formos išlendančios be puslapio persikrovimo ir kol jos lenda, turi suktis rutuliukai. :)

Kad galėtumėme naudotis integruotomis funkcijomis, mums savo projekto html headeryje reikia įtraukti tokią eilutę:

<%= javascript_include_tag "prototype" %>

Tačiau iki šiol mūsų visi puslapiai buvo generuojami ne visai korektiškai, nes jie neturėjo nei <head>, nei <body> tagų. Kad ištaisytume šį trūkumą, turime susikurti pagrindinį šabloną, kurio pagrindu bus generuojami visi likę puslapiai.

Sukuriame /views/layouts/application.rhtml ir iš karto įtraukiame bibliotekas:

<html>
<head>
 
<%= javascript_include_tag "prototype" %>
 
</head>
<body>
<%= flash[:notice] %>
<%= yield %>
 
</body>
 
</html>

Kuriame pa’‘intą formą:

/views/user/show.rhtml įdedu nuorodą, kurią paspaudus galėsime pastatyti alaus regsitruotam vartotojui. link_to_remote funkcija krepsis į new_beer metodą, kuris sugeneruos new_beer patial’ą ir įterps rezultatą į div id=”new_beer”

<%if session['uid']-%>
<%= link_to_remote ("Pastatyk žmogeliui alaus",
:update => "new_beer",
:loading => "Element.show('spinner')",
:complete =>  "Element.hide('spinner')",
:url =>{:controller=>'cheer', :action=>'new_beer', :receiver_id=>@user.id})%>
 
<%= image_tag("spinner.gif",
:align => "absmiddle",
:border => 0,
:id => "spinner",
:style =>"display: none;" ) %>
 
<div id="new_beer">
 
</div>
<%end-%>

Sukuriu partial_new_beer.html

<%= form_tag :action => 'create_beer_for_user' %>
Už ką: <%= text_area "cheer", "desc", :rows => 4 %>
<%=hidden_field "cheer", "receiver_id", :value=>params[:receiver_id]%><br />
<%= submit_tag "Pastatyti alaus" %>
</form>

Cheer kontroleryje sukuriu metodą sugeneruojantį _new_beer partial’ą

def new_beer
 
render :partial =&gt; 'new_beer'
 
end

Cheer kontroleryje sukuriu ‘create_beer_for_user‘ metodą

def create_beer_for_user
 
@cheer = Cheer.new(params[:cheer])
@cheer.giver_id = session['uid']
 
if @cheer.save(false) #jei nurodome false, informaciją išsaugojame nekreipiant dėmesio į validationus aprašytus modelyje.
#šiuo atveju mano @cheer objektas neturi email informacijos, todėl pro validaciją jis nepraeitų. Kadangi tai registruotas vartotojas, tai šiuo atveju jo emailo man ir nereikia.
flash[:notice] = 'Alus pastatytas.'
redirect_to :action =&gt; 'list'
else
flash[:notice] = 'Klaida.'
redirect_to :action =&gt; 'list'
end
 
end

Meniu

Kol kas visos funkcijos buvo pasiekiamos naršyklės adresų laukelyje rankomis įvedant URL. Žinoma, normalus tinklalapis taip negali veikti ir jam reikia nors paprasčiausio meniu.

Sukuriu naują partial’ą /views/lauouts/_meniu.rhtml

<%if session['uid']-%>
Labas <b><%=User.find(session['uid']).login%></b> <%= link_to 'Atsijungti', :controller=>'user', :action=>'logout'%> <br /><%= link_to 'Nustatymai', :controller=>'user', :action=>'my_details'%> |<%= link_to 'Pastatyti alaus el. paštu', :controller=>'cheer', :action=>'new_beer_by_email'%>
<%else-%>
Esate neregistruotas vartotojas. <%= link_to 'Prisijunkite', :controller=>'user', :action=>'login'%><br />
<%end-%>
<%= link_to 'Alaus statymai', :controller=>'cheer', :action=>'list'%> | <%= link_to 'Vartotojai', :controller=>'user', :action=>'list'%>
 
<br /><br />

Ir jį įtraukiu į pagrindinį šabloną (angl. template) application.rhtml

<body>
 
<%=render_partial 'layouts/meniu'%>
<%= flash[:notice] %>
<%= yield %>
 
</body>

Pirmam kartui užteks. Visa tai padaryti užtruktų 0,5 - 1 val., tačiau aprašymas atima kur kas daugiau laiko. Ypač kai nebalai supranti ką rašai. :)

OK, tai kitam kartui liko:

  1. Informacijos siuntimas el. paštu;
  2. Vartotojų el. pašto adresų valdymas;
  3. Vartotojų registracija;
  4. Nors miminalus dizainas;
  5. Lietuviški klaidų pranešimai;

Dabartinę versiją galite pažiūrėti www.stataualaus.lt.

Panašūs straipsniai


“Kaip per 3 naktis sukurti web2.0 internetinį projektą arba kaip nereikia programuoti su Ruby on Rails (I dalis)” komentarų: 9

  1. elt.lt » Blog Archive » Apžvalga. Šiandien aš skaičiau… #26

    […] Kaip per tris dienas sukurti Web 2.0 projektą? Sakote neįmanoma? Svarbu tik pasirinkti tinkamus darbo įrankius… […]

  2. Gintaras

    Klausimas ne į temą - ką daryti negeriantiems alaus ? :)

    Klausimas į temą - kur viskas hostinama, atsiprašau kalbininkų - talpinama?

  3. KIK

    Geras straipsnis, šauniai padirbėta (netgi su video) :) Straipsnis sakyčiau labiau skirtas mokantiems programuoti (bent šiek tiek) bent kita kalba :) Norint, kad jį (turiu omenyje kodą) suprastų dar mažiau suprantantys kas yra programavimas reiktų daugiau komentarų.
    P.S. Ir vėl WP padarė savo :)

  4. Tomas Aleksiejunas aka NPBMK

    1. tada gali atsifet arbatos
    2. o kur gali buti hostinama? Serveryje :) Tik jis yra ne Lietuvoje, o Vokietijoje. Nes pats turbut supranti, kad Lietuvoj draudziama apie alu viesai kalbet.

  5. Tomas Aleksiejunas aka NPBMK

    norejau parasyt - atsigert

  6. Tomas Aleksiejunas aka NPBMK

    2 KIK
    pilnai sutinku su tavim, kad trūksta detalizavimo. Aš pats dėl to nesu labai patenkintas. Tiesiog jėgų pritrūko.

  7. Savaitgalio skaitiniai #48 » Pixel.lt

    […] Sveiki, šią savaitę sulaukėme pirmo straipsnio apie Python programavimo kalbą - “Įvadas į Python” bei pirmos dalies “Kaip per 3 naktis sukurti web2.0 internetinį projektą arba kaip nereikia programuoti su Ruby on Ra…“. […]

  8. hei

    Klausimėlis ar nebūtų galima parašyti tutorialo, kaip konfiginti servą su apach, kad ruby on rails projektas būtų pasiekiamas iš išorės, o ne tik iš localhosto. Gal kas kokių išsamių linkų?

  9. gedas

    ne nu kiek laiko galima laukt kitos dalies

Rašyti komentarą

Jūs privalote prisijungti jeigu norite rašyti komentarą.