Darbo įrankiai ir aplinka
Kadangi vienastoks visa tai pavadino ‘girtu projektu’, tai prisilaikydamas šios linijos, atsikemšu butelį alaus ir pradedu darbą:)
Be Ruby on Rails aš dar pasinaudosiu:
- MySQL serveriu
- MySQL klientu Navicat
- Aptana RadRails IDE
Jei kas pradedate programuoti su RoR 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 RoR 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).
Ruby on Rails 2.0.2
Kol aš rašiau įžangą kaip lengva programuoti su RoR, spėjo išeiti nauja RoR 2.0 versija. Ir dabar ne viskas veikia, kas veikdavo pirmojoje versijoje.
Praeitų metų gruodžio mėnesį buvo išleista nauja RoR 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 RoR 1.X ir 2.X versijų prasideda nuo pat projekto kūrimo pradžios. Anksčiau RoR 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 RoR 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:
ruby script/generate scaffold User login:string realname:string desc:text birthday:date
Jei norime, kad RoR 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 RoR.
Gem’ai ir pluginai (įskiepiai)
RoR yra nuostabus ne tik tuo, kad kodo rašymas yra nesudėtingas, bet RoR 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 RoR 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 RoR 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 RoR 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”.
RoR 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 RoR yra kvailas ir pakišite jam “citys” - RoR nesupras, kad informacija apie city yra saugoma citys lentelėje.
Atsiminkite, ką sakiau šių straipsnių serijos įžangoje, kad RoR 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į į RoR 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:
ruby script/generate model User
Sukuriu kontrolerį User:
ruby 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 => 'my_details' else flash[:notice] = 'Klaida.' render :action => '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.
RoR 1.x versijoje buvo standartinis ‘paginate’ helperis, kuris tą darbą už mus atlikdavo. Kadangi ši funkcija nebuvo labai efektyvi bei funkcionali, RoR 2.x versijoje ji buvo panaikinta. Kiek teko skaityti, tai dabar vietoj jos rekomenduojama naudoti įskiepį will_paginate. Taigi jį ir įdiegsime:
ruby script/plugin install will_paginate
User kontroleryje sukuriu metodą ‘list’
def list @users = User.paginate(:page=>params[:page], :per_page=>20, :order=>'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į
ruby script/generate model Cheer
Sukuriu Cheer kontrolerį
ruby 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
ruby 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 => 'list' else flash[:notice] = 'Klaida.' render :action => '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=>params[:page], :per_page=>20, :order=>'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 Ajax. 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 RoR integruotomis Ajax 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 Ajax bibliotekas:
<html> <head> <%= javascript_include_tag "prototype" %> </head> <body> <%= flash[:notice] %> <%= yield %> </body> </html>
Kuriame pa’ajax‘intą formą:
/views/user/show.rhtml įdedu nuorodą, kurią paspaudus galėsime pastatyti alaus regsitruotam vartotojui. link_to_remote ajax 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 => '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 => 'list' else flash[:notice] = 'Klaida.' redirect_to :action => '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:
- Informacijos siuntimas el. paštu;
- Vartotojų el. pašto adresų valdymas;
- Vartotojų registracija;
- Nors miminalus dizainas;
- Lietuviški klaidų pranešimai;
Dabartinę versiją galite pažiūrėti www.stataualaus.lt.
2008-01-16 | 18:04
[…] Kaip per tris dienas sukurti Web 2.0 projektą? Sakote neįmanoma? Svarbu tik pasirinkti tinkamus darbo įrankius… […]
2008-01-16 | 18:58
Klausimas ne į temą - ką daryti negeriantiems alaus ? :)
Klausimas į temą - kur viskas hostinama, atsiprašau kalbininkų - talpinama?
2008-01-16 | 23:19
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 :)
2008-01-16 | 23:43
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.
2008-01-16 | 23:45
norejau parasyt - atsigert
2008-01-17 | 16:09
2 KIK
pilnai sutinku su tavim, kad trūksta detalizavimo. Aš pats dėl to nesu labai patenkintas. Tiesiog jėgų pritrūko.
2008-01-19 | 14:58
[…] 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…“. […]
2008-02-28 | 17:18
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ų?
2008-05-10 | 9:57
ne nu kiek laiko galima laukt kitos dalies