Internet

"RubyOnRails - når webudvikling skal være sjovt"

RubyOnRails (også bare kaldet Rails) er et framework til udvikling af dynamiske web-applikationer bygget oven på det objekt-orienterede scriptsprog Ruby. Dette framework samler flere avancerede features, som giver web-udviklere høj produktivitet uden at gå på kompromis med gode programmeringsmæssige principper.

I 2005 valgte Google at tildele ophavsmanden til RubyOnRails, danskeren David Heinemeier Hansson, årets Open Source Award i kategorien “Best hacker" for hans arbejde med Rails.

Hvad er Ruby?
Ruby er et open source, dynamisk, objekt-orientet scriptsprog opfundet af japaneren Yukihiro "matz" Matsumoto. Sproget kombinerer elementer fra Perl, Smalltalk, Eiffel, Ada og Lisp. En af grundende til at Ruby tiltrækker mange programmører, er at mange finder det elegant og meget udtryksfuldt. I Ruby kan man opfatte alt som objekter, og man kan f.eks. skrive:

5.times { print "Hello world" }
hvilket naturligt nok udskriver teksten "Hello world" 5 gange.

Selvom sproget først blev offentliggjort i 1995, findes der efterhånden en del gode bøger om det, og søger man på nettet, finder man et community omkring Ruby, der vokser og har det godt. RubyOnRails er den første rigtige killer applikation til Ruby, og interessen omkring Rails har smittet af på Ruby.

Hvad er RubyOnRails?
Rails er et MVC framework til udvikling af web-applikationer. MVC står for Model-View-Controller og tanken i MVC er, at adskille objektmodellen fra selve applikationskoden, som igen er adskildt fra præsentationskoden. Denne lagdelte struktur gør det lettere at bygge og vedligeholde web-applikationer. Til hver af disse lag findes der i Rails et eller flere programbiblioteker, der understøtter de enkelte lag. De centrale programbiblioteker er ActiveRecord (som gør det muligt at gemme objekter i en relationel database og hente dem ud igen), ActionController (som understøtter selve flow'et i web-applikationen) og ActionView (som understøtter præsentationslaget).

I RubyOnRails er der et gennemgående tema, der hedder "konvention fremfor konfiguration". Det betyder f.eks. at man skal navngive tabeller og felter i databasen på en bestemt måde. Til gengæld er der meget lidt man skal konfigurere. Oftest kan man nøjes med at konfigurere databaseforbindelsen.
Alle disse konventioner kan opfattes som begrænsninger, men de har en positiv effekt på produktiviteten, da der ikke skal tages stilling til ting som navngivning eller mappestruktur.

Automatisk test af ens kode er vigtigt, men ofte glemmer man at gøre det. Derfor har Rails indbygget support for automatiske tests, så som unittests. Når man tilføjer nye klasser til projektet, så oprettes der også test klasser, så det er let at komme igang med at teste.

Som ethvert moderne web-framework med respekt for sig selv har Rails selvfølgelig også en god understøttelse af Ajax (asynkront JavaScript og XML). Det er let at sende en formular via Ajax og derefter i svaret opdatere forskellige elementer på siden uden at hele siden skal hentes fra serveren igen.

Alt i alt indeholder RubyOnRails alle ingredienserne til at bygge en robust, moderne web-applikation.

ActiveRecord
En af de første ting man falder for i Rails er ActiveRecord, som gør det let at gemme objekter i en relationel database. Hvis man f.eks. i databasen opretter en tabel kaldet "projects" med felterne "id", "name" og "startdate", så sørger ActiveRecord for at den tilsvarende Project-klasse har de samme felter. ActiveRecord tilføjer ligeledes metoder til at finde, gemme og slette objekterne i databasen. Det betyder at man i langt mindre grad, end ved andre web-teknologier, selv skal skrive SQL til at hente data ud af databasen.

I ActiveRecord mapper en klasse i objektmodellen til en tabel i databasen. Ofte har man også relationer til andre tabeller. ActiveRecord gør det muligt at udtrykke disse relationer i objektmodellen. Hvis vores "projects" tabel fra før udviddes med en fremmednøgle til en tabel med "managers", så kan vi udtrykke relationen således i objektmodellen:

class Project < ActiveRecord::Base
belongs_to :manager
end
class Manager < ActiveRecord::Base
has_many :projects
end

Dette udtrykker at et projekt tilhører en projektleder, og at en projektleder kan være tilknyttet flere projekter. ActiveRecord tilføjer et "manager" felt til klassen "Project" og et "projects" felt til klassen "Manager".
ActiveRecord indeholder derudover mange flere ting såsom callbacks (så man kan kæde handlinger på objekter når de f.eks. gemmes), polymorfiske associationer og pre-loading af relaterede objekter, når man henter objekter ud af databasen.

ActionController og ActionView
Rails benytter sig at et designpattern kaldet "Front Controller". Dette designpattern går ud på at alle forespøgsler til web-applikationen håndteres at en såkaldt "dispatcher" som sørger for at finde den rigtige controller til at servicere forespørgslen. Controllerens opgave er herefter at udføre den relavante action (metode).

I følgende eksempel kaldes url'en localhost/blog/show/11 som bevirker at show() metoden kaldes i blog controlleren (tallet 11 gemmes som en parameter med navnet id):



class BlogController < ApplicationController
def show
@post = Post.find(params[:id])
end
end

Efter metoden show() er udført kaldes skabelonen app/views/blog/show.rhtml, og variablen @post er tilgænglig fra skabelonen.
De HTML-skabeloner som web-applikationen benytter skrives som en blanding af HTML og Ruby via en teknologi kaldet ERb (Embedded Ruby). Den Rubykode man skriver i skabelonen skal kun benyttes til at styre præsentationslogikken og ikke til at hente data ud af databasen da dette gøres i controlleren.

Skabeloner kan nedbrydes i del-skabeloner kaldet "partials" og disse del-skabeloner kan benyttes på forskellige sider.

ActionView består endvidere af en masse hjælpe-klasser som bl.a. gør det let at bygge formularer, generere links og indsætte JavaScript effekter via et JavaScript bibliotek der hedder script.aculo.us.

At Rails har en god understøttelse af Ajax illustreres bedst med at par eksempler i brugen af RJS skabeloner. Med RJS-skabeloner genereres JavaScript koden ud fra noget Rubykode.

Når man kalder webserveren via et Ajax-kald, kan man f.eks. svare med en RJS-skabelon på følgende måder:

Erstat indholdet at et element på siden:
page.replace_html :element, "nyt indhold"

Kald en JavaScript funktion på siden:
page.call :alert, "Hej"

Benyt en af de visuelle effekter:
page.visual_effect :highlight, 'shoppingCart'

Hvis dette har givet blod på tanden, vil vi nu se på hvordan man installerer RubyOnRails og kommer igang med det først projekt.

Installation af Rails
Da Rails er skrevet i Ruby kan det afvikles på de platforme som Ruby understøtter herunder Windows, OS X og Linux. Installationen kan variere lidt, men generelt skal man installere følgende 3 ting:

• Ruby. På Windows installerer man "One-click Ruby Installer" fra siden rubyforge.org. Dette program installerer den seneste version af Ruby samt et par nyttige hjælpeprogrammer og dokumentation til sproget Ruby. På Linux er det letteste at finde en pakke til den Linux distribution man benytter.



• RubyGems. Ruby har sit eget pakkesystem kaldet RubyGems (er med i "One-click Ruby Installer") som gør det let at installere Ruby software. RubyGems kan også hentes fra rubyforge.org og herefter pakker man den downloade fil ud og kører følgende kommando fra prompten: $ ruby setup.rb



• Rails. Med RubyGems installeret kan man installere Rails ved at åbne en kommandoprompt og skrive følgende:
$ gem install rails --include-dependencies
RubyGems downloader og installerer herved Rails fra internettet.

Igang med RubyOnRails
Når man starter et nyt Rails projekt, får man Rails til at oprette den mappestruktur, som projektet skal benytte sig af. Dette sikrer bl.a. at konventionerne overholdes.

Man opretter et nyt Rails projekt således:
$ rails demo

Rails opretter nu et nyt projekt, som vi kalder "demo". Den vigtigste mappe i projektet er app/ mappen. Her skal det meste af koden til vores web-applikation ligge.

Rails kommer med sin egen webserver, som primært benyttes ved udvikling. For at starte denne webserver skriver man fra roden af projektet:

$ ruby script/server

Dette starter webserveren, og man kan nu tilgå sitet på adressen localhost hvor man mødes af en velkomstside.


Lad os starte med det klassiske "Hello world" eksempel. Vi starter med at tilføje en controller til vores projekt. For at tilføje en controller der hedder "Hello" til projektet skriver vi:

$ ruby script/generate controller Hello

Rails fortæller os nu hvilke filer der blev oprettet heriblandt selve filen til controller-klassen som ligger i app/controllers/hello_controller.rb.
Vi kan nu åbne denne fil i en tekst editor og tilføje følgende metode til klassen:

class HelloController < ApplicationController def world
@greeting = "Hello world!"
end
end

Herefter opretter vi filen world.rhtml i mappen app/views/hello/. I denne skabelon skriver vi:

(!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd")
(html xmlns="http://www.w3.org/1999/xhtml")
(head)
(title>Demo</title)<br />(/head)
(body)
(h1)(%= @greeting %)(/h1)
(/body)
(/html)

Når vi besøger siden localhost/hello/world får vi en html side med vores hilsen indsat imellem de to (h1)-tags.



Tilføj selv flere controllers og modelklasser via scriptet script/generate.

Produktivitet og glæde
RubyOnRails forsøger at gøre web-udvikling sjovt og produktivt. Et mantra for Ruby og Rails er "Increase programmer happiness", for kun derved kan man opnå vedvarende produktivitet og nære den kreativitet, der får os til at arbejde med programmering.

Rails indeholder så mange gode ideer, at selvom man ikke kan eller vil bruge det til daglig, skylder man sig selv at kigge på det og suge til sig af gode ideer.


Om artiklens forfatter:
"Nis Wilson Nissen arbejder til daglig med udvikling af det internet-baserede bookingsystem til turistbranchen, BookingStudio, i firmaet Knappe & Kragh ApS. Har tidligere været udvikler i TV 2 Interaktiv og hos NetDoktor."

Odense:

Foredrag om Ruby on Rails
Ved Nis Wilson Nissen.

10. februar 2007, kl. 12

I Ungdomshuset,
Nørregade 60, Odense C

Install-café afholdes efter foredraget.

Arr. Fyns Linux User Group (FLUG) - i samarbejde med PROSA/STUD