Movlin  ¦   CV   ¦   Kontakt  ¦   Blog

CV

Systemarkitekt

Systemintegration

BizTalk Server

Java

Java EE 5

Open Source

Spring

Ruby on Rails

Websiteanalys

Bokrecensioner

Konferenser

Øredev, Malmö 2007
The Server Side, Barcelona 2007
SAP TechEd 2006
JAOO 2006
Sime05

Ruby on Rails

Ramverket Ruby on Rails har ett intressant tänk runt systemutveckling och framförallt för webbutveckling. Ruby on Rails kommer troligtvis påverka webbutveckling ytterligare ett steg i rätt riktning då vi fortfarande efter drygt 10 år brottas med mer eller mindre samma problem då som nu.

Att komma igång med Rails och att förändra systemet var verkligen så lätt som förespråkarna gör gällande trots mina okunskaper i Ruby. Till att börja med kommer det framförallt att attrahera utvecklare av andra scriptspråk såsom PHP då infrastrukturen är bättre än PHP:s till exempel. Men, redan idag har det påverkan på framförallt Java då en del tidigare Java-förespråkare har vänt sig till Ruby on Rails (i hopp om att kanske få sälja fler böcker?).

Nedan har jag har kort sammanfattat mina intryck av Ruby on Rails.

Exempel - Websitetrack

För att göra ngt konkret med Ruby on Rails implementerade jag delar av Websitetrack med Ruby on Rails och exempelkoden nedan är hämtade därifrån.

Konvention framför konfiguration

Genom grundtanken att använda en given namnkonvention så behöver man inte göra någon konfiguration förrän man vill/måste frångå den.
Exempelvis är det ganska troligt om man vill integrera med en existerande databas att den då inte följer Rails namnstandard. I det fallet krävs det att du ändrar på konfigurationen. Rails bygger också en bibliotekstruktur och med en given biblioteksnamnstandard.

Detta är naturligtvis en reaktion på all den konfiguration med en uppsjö av xml-filer som ibland krävs för framförallt Java-plattformen för att skapa den enklaste testapplikation. I Rails kan det räcka med tre raders kod och så kan man generera körbar kod.

Rails - Ett ramverk för Ruby

Ruby är ännu ett scriptspråk med sina finesser där den kompakta syntaxen är framträdande. Dessutom finns det en hel del lånat ifrån andra språk vilket är en annan styrka.

Det är inte Ruby som gör Ruby on Rails intressant utan ramverket och i det är det framförallt två saker som tilltalar.

  • ActionPack - MVC ramverk
  • ActiveRecord - persistensramverk

ActionPack

ActionPack består egentligen av kontrollmodulen, ActiveController, samt vymodulen, ActiveView.


1. http://websitetrack.se/visitor/list
2. Routing hittar VisitorController
3. VisitorController begär att få alla besökare ifån modellen Visitor
4. VisitorController anropar vyn (list.rhtml)
5. Vyn rendrererar nästa sida för browsern

ActiveView

ActiveView modulen hanterar inkapslingen av funktionaliteten för att rendrera mallar/templates. Mallarna liknar de flesta andra sidscriptspråk (JSP, ASP, PHP, etc)

I exemplet nedan i vyn att listas alla besökare i vyn visitor om man valt action "list"

<% for visitor in @visitors %>
  <tr>
  <% for column in Visitor.content_columns %>
    <td><%=h visitor.send(column.name) %></td>
  <% end %>
    <td><%= link_to 'Visits', :action => 'visits', :id => visitor %></td>
    <td><%= link_to 'Show', :action => 'show', :id => visitor %></td>
    <td><%= link_to 'Edit', :action => 'edit', :id => visitor %></td>
    <td><%= link_to 'Destroy', { :action => 'destroy', :id => visitor }, 
                                          <:confirm => 'Are you sure?', :post => true %></td>
  </tr>
<% end %>

/app/views/visitor/list.rhtml

ActionController

ActionController är kontrollklasserna som är navet i Rails.

Det är kopplingen till ActionController som gör ramverket intressant. Trots att de hör ihop är det helt åtskilda om man ser till bibliotek och filer. Controller-klasserna hamnar per default i /app/controllers och vyerna i /app/views.

ActionController är helt befriat ifrån https request och response.

  def list
    @visitor_pages, @visitors = paginate :visitors, :per_page => 10
  end

/app/controllers/visitor_controller.rb

Rails MVC-ramverk har lyckats på ett föredömligt sätt gömma det faktum i kontrollklasserna att det är http-request som vi handskas med. Uppdelningen mellan modellen, vyn och kontrollklasserna är rena och klara.

ActiveRecord - objekt-relations-mappningen (ORM)

Det tredje benet i MVC-arkitekturen, Model, är ActiveRecord vilket på samma gång är persistenthanteringen av modelobjekten.

Genom att använda Rails namnkonvention för databas och modellklasser så är det med lätthet man skapar sig en körbar informationsmodell med de mest grundläggande relationer mellan klasser (en-till-en, en-till-många, många-till-många).
Dessutom går det att ange attribut som ägs-av och tillhör-flera. Alla dessa relationer tar ActiveRecord hand om och låter mig koncentrera mig på affärslogiken.

Exempelvis då deklarerar man beroendet mellan en besökare och dess besök på följande vis. En besökare har ett eller flera besök och varje besök tillhör en unik besökare.

En "många" relation går att sortera som man vill :order.

class Visit < ActiveRecord::Base
	belongs_to	:visitor
	has_many	:pagevisits,
			:order => "visited_at"
		
end

class Visitor < ActiveRecord::Base
	has_many	:visits
	has_one	:most_recent_visit,
			:class_name => "Visit",
			:order => "last_visit_at desc"
end

Modelklasserna ovan matchas mot följande tabeller.

create table visitors (
	id	int	not null auto_increment,
	ip	varchar(15)	not null,
	name	varchar(200)	null,
	robot	boolean	not null default false,
	robot_id	int	null,
	constraint	fk_visitors_robot foreign key(robot_id) references robots(id),
	primary key(id)
);
ALTER TABLE visitors ADD INDEX `IP_IDX`(`ip`);

create table visits (
	id	int	not null auto_increment,
	visitor_id	int	not null,
	referrerurl	varchar(600)	null,
	referrerquery	varchar(100)	null,
	first_visit_at	datetime	not null,
	last_visit_at	datetime	not null,
	browser	varchar(200)	null,
	constraint	fk_visits_visitor foreign key(visitor_id) references visitors(id),
	primary key (id)
);

Den uppmärksamme noterar följande:

1. Om det finns en klass med namnat Xxxxx (Visitor) och en tabell i databasen med motsvarande namn i pluralis xxxxxs (visitors) så tolkar Rails att de hör ihop och utifrån det skapar den magiska bindningen.

2. Man behöver inte deklararera egenskaper i klasserna. Har du en bindning mellan klass och tabell så har du egenskaperna per automatik, klassen Visitor har bl.a egenskapen name,ex @visitorname = visitor.name

Kodgenerering

Genom de färdiga kodgenereringsripten så tar det inte lång tid förrän man har en körbar prototyp för att visa upp informationsmodellen och tillåta CRUD operationer på dessa.

Testdriven utveckling

Då Rails hävdar att vara ett Agile-språk så måste naturligtvis test vara med som en hörnsten. Inte nog att det är med för att det måste så har man uttökat tänket en bit. Idén med testfixturer är inte ny, men elegant på det sätt som det är gjort. I testfixturerna anger man sin testdata för det aktuella testet och genom att följa namnkonventionen laddas fixturen in i databasen innan testet och testdatabasen rensas även upp efteråt.

Dessutom tilltalades jag av idén med att skapa mockobjekt genom att ärva ifrån klassen som ska "mockas" istället för att skapa en helt ny mockklass.

Filters - Aspektorintering

Genom filters kan man använda sig interceptorer som anropas på samma sätt som i en aspektorienterad miljö.

The silver bullet - vad saknas?

Som alla nya produkter/ramverk/språk så saknas det alltid något och så även Rails.

Flerspråksstöd

Rails namnkonvention bygger helt och hållet på det engelska språket. Det är kanske därför som man glömt bort att ta med stöd för flera språk i grundramverket. Jag hittade på nätet ett par "Gems" (Rubypaket) för att hantera detta fundamentala område för webben.

Verktyg

I dessa dagar då leverantörerna slänger verktygen efter oss systemutvecklare och då framförallt på Java-plattformen med Eclipse och Netbeans så är jag rätt kräsen vad gäller utvecklingsverktyg. Produktiviteten ligger trots allt rätt mycket i de verktyg vi använder.
Intellisense för syntaxen av Ruby, som är okänt för de flesta, blir en mycket viktig faktor. Det räcker inte med att man får "rätt" font färg i verktyget.
Stöd för debugging är en annan viktig del i systemutveckling. Avsaknaden av riktigt bra stöd för detta drar ned beyget för Ruby on Rails.

Stor leverantör

Det är sällan som ett val av verktyg/ramverk/plattform görs enbart utifrån rent tekniska grunder och än så länge så finns det ingen av de stora drakarna som sagt att de kommer lägga tid och resurser för att marknadsföra Rails. Därför drivs det av teknikerna som sett ljuset i tunneln, men det räcker inte i längden. Det spelar då ingen roll att ramverket är otroligt tekniskt intressant.

Framtiden

Hur framtiden ser ut för Ruby on Rails är naturligtvis svårt att säga, men många av idéerna kommer att transformeras till andra plattformar exempelvis Java och .Net. Redan nu finns t.ex. ett första ramverk för Java som anammat en del av Rails tänk (se http://www.romaframework.org).

Referenser

Agile Web Development with Rails.
Ruby on Rails officiella hemsida
Programspråket Rubys officiella hemsida

Movlin | Adress: Humlevägen 24, 437 42 Lindome | Telefon: 0708-320809 | E-post: | © 2005-2008