RubyOnRails_inleiding.ppt - Informatica Blok 2 docent: Kris.Aerts ...
-
Upload
aabbccddeeee -
Category
Documents
-
view
487 -
download
1
description
Transcript of RubyOnRails_inleiding.ppt - Informatica Blok 2 docent: Kris.Aerts ...
[email protected]@khlim.be 11
Het MVC-frameworkHet MVC-frameworkRuby on RailsRuby on Rails
Ietwat beschouwend en Ietwat beschouwend en
hands-on tegelijkhands-on tegelijk
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
OverzichtOverzicht
Klein woordje over de omgevingKlein woordje over de omgeving Belangrijkste principesBelangrijkste principes Snelle test : Depot Snelle test : Depot
http://pragprog.com/titles/rails2http://pragprog.com/titles/rails2 Principes concreter gemaaktPrincipes concreter gemaakt
Traditionele tutorial van “10 minuten”Traditionele tutorial van “10 minuten” Geavanceerdere dingenGeavanceerdere dingen
afsprakensysteemafsprakensysteem
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
Omgeving: netbeans 6.1Omgeving: netbeans 6.1
Eerst Ruby installeren via Eerst Ruby installeren via http://http://www.rubyonrails.orgwww.rubyonrails.org/down/down Meer info over Ruby on Rails: Meer info over Ruby on Rails: http://http://www.rubyonrails.orgwww.rubyonrails.org//
Netbeans zelf Netbeans zelf http://bits.netbeans.org/download/trunk/nightly/latest/http://bits.netbeans.org/download/trunk/nightly/latest/ Voor Mac en Windows zélfde omgeving!!Voor Mac en Windows zélfde omgeving!! Kies IDE met ondersteuning voor Ruby Kies IDE met ondersteuning voor Ruby
Alleen ruby support als weinig geheugen (heb ik sowieso gedaan)Alleen ruby support als weinig geheugen (heb ik sowieso gedaan) Zorg ook voor localhost met mysqlZorg ook voor localhost met mysql
http://www.xampp.orghttp://www.xampp.org Eventueel in config.inc.php auth_type veranderen naar httpEventueel in config.inc.php auth_type veranderen naar http
Bookmark http://www.netbeans.org/kb/trails/ruby.htmlBookmark http://www.netbeans.org/kb/trails/ruby.html
http://http://lifeonrails.orglifeonrails.org/2007/8/30//2007/8/30/netbeans-the-best-ruby-on-rails-idenetbeans-the-best-ruby-on-rails-ide
Alternatieven: InstantRails voor Windows, Locomotive voor Alternatieven: InstantRails voor Windows, Locomotive voor MacMac
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
Rails upgraden naar 2.0.2Rails upgraden naar 2.0.2
Kies “File” Kies “File” “New project” “New project” rechts “Ruby On Rails rechts “Ruby On Rails Application”Application”
Klik “Next” Klik “Next” Selecteer onderaan het Ruby-platform “Ruby 1.8.6”Selecteer onderaan het Ruby-platform “Ruby 1.8.6” Als het er niet bij staat -> manage platforms Als het er niet bij staat -> manage platforms
add platform, selecteer ruby.exe in de map ruby/bin add platform, selecteer ruby.exe in de map ruby/bin Nog eens “Next”Nog eens “Next” Dan bovenaan “Install Rails” Dan bovenaan “Install Rails”
Op naar versie 2.0.2Op naar versie 2.0.2 Duurt wel efkes!Duurt wel efkes!
En dan “Finish” En dan “Finish” De eerste keer wordt Ruby en Instant Rails ook nog helemaal De eerste keer wordt Ruby en Instant Rails ook nog helemaal
geindexeerd voor gebruik in de omgeving.geindexeerd voor gebruik in de omgeving.
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
Belangrijk Belangrijk Design PatternDesign Pattern : : MVCMVC
Model Model
View View
Controller Controller
cfr. invoer – verwerking - uitvoer
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
MVC volgens RailsMVC volgens Rails
Model is direct gekoppeld aan database (per tabel een model)Model is direct gekoppeld aan database (per tabel een model) Grotendeels automatisch gegenereerdGrotendeels automatisch gegenereerd
View is de webpagina View is de webpagina .html.erb = html met klein beetje Ruby.html.erb = html met klein beetje Ruby
Controller vertaalt requests van view in acties op databaseController vertaalt requests van view in acties op database Directe mapping tussen methodenaam en ‘bestand’ van de viewDirecte mapping tussen methodenaam en ‘bestand’ van de view
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
Doordacht frameworkDoordacht framework
Development – Testing – DeploymentDevelopment – Testing – Deployment Zijn verschillende fasesZijn verschillende fases Belang wordt nogal eens onderschatBelang wordt nogal eens onderschat Hier mooi ingebakkenHier mooi ingebakken
Aparte databases!Aparte databases! Migratie tussen versiesMigratie tussen versies Ondersteuning van EROndersteuning van ER Declaratief : meer “wat” dan “hoe”Declaratief : meer “wat” dan “hoe”
‘‘validatie’ van veldenvalidatie’ van velden Opstellen van een formulierOpstellen van een formulier Abstractie van SQL (~~)Abstractie van SQL (~~)
Mooie actie-gebaseerde URL’sMooie actie-gebaseerde URL’s
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
GeautomatiseerdGeautomatiseerd
OO: Getters & setters OO: Getters & setters database : CRUD database : CRUD Create, Read, Update and DeleteCreate, Read, Update and Delete
Rake (Ruby Make): neemt repetitief werk Rake (Ruby Make): neemt repetitief werk overover
Code-generatie : scaffoldingCode-generatie : scaffolding In rails 1.2.5 blijft die ‘automatisch’ up to dateIn rails 1.2.5 blijft die ‘automatisch’ up to date In rails 2 is die code een vertrekbasisIn rails 2 is die code een vertrekbasis
Niet automatisch up 2 dateNiet automatisch up 2 date Minder parameters (dus meer default gedrag)Minder parameters (dus meer default gedrag) Maar wel meer (betere) controle voor ontwikkelaarMaar wel meer (betere) controle voor ontwikkelaar
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
Belangrijkste verandering in Belangrijkste verandering in 2.02.0
Traditionele scaffolding is weg!Traditionele scaffolding is weg! Dus meeste tutorials van 1.2 werken Dus meeste tutorials van 1.2 werken
niet!niet! Korte uitleg Korte uitleg
http://davidlynch.org/blog/2008/01/rails-20-scaffolding/http://davidlynch.org/blog/2008/01/rails-20-scaffolding/ Langer http://luthdev.blogspot.com/2008/01/ruby-on-rails-2-Langer http://luthdev.blogspot.com/2008/01/ruby-on-rails-2-
activescaffold-and.htmlactivescaffold-and.html
Komt sebiet sowieso aan bodKomt sebiet sowieso aan bod
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
Depot Snelle TestDepot Snelle Test
New Project New Project Samples Samples Rechtermuis -> Set Configuration -> custom -> Ruby 1.8.6Rechtermuis -> Set Configuration -> custom -> Ruby 1.8.6 Voor Rails 2: verander in ConfigurationVoor Rails 2: verander in Configurationboot.rbboot.rb
Regel 55 en 65: vervang require_gem “rails.. door gem “rails..Regel 55 en 65: vervang require_gem “rails.. door gem “rails..
Maak database voor user mét paswoord (bv. ror – ror)Maak database voor user mét paswoord (bv. ror – ror) Manueel met phpmyadminManueel met phpmyadmin
Sla deze gebruiker op in Configuration – database.ymLSla deze gebruiker op in Configuration – database.ymL
Tabellen creeren : Migrate database to current versionTabellen creeren : Migrate database to current version Applicatie uitvoeren : rechtermuistoets Applicatie uitvoeren : rechtermuistoets Run Run
Test in je browser http://localhost:3000Test in je browser http://localhost:3000
Screencast Screencast http://www.rubyplus.org/episodes/19-AWDR-Depot-App-using-http://www.rubyplus.org/episodes/19-AWDR-Depot-App-using-Rails-2-version.htmlRails-2-version.html
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
Rails 2.0 weblog in 10 Rails 2.0 weblog in 10 minutenminuten
http://blogs.sun.com/divas/entry/creating_a_rails_2_0http://blogs.sun.com/divas/entry/creating_a_rails_2_0
Voorbereidend werkVoorbereidend werk
Stap 0: maak ER-schemaStap 0: maak ER-schema Stap 1: creeer applicatieStap 1: creeer applicatie Stap 2: pas database.yml aanStap 2: pas database.yml aan Stap 3: creeer db Stap 3: creeer db
““Run Rake Task > db > create Run Rake Task > db > create ””
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
scaffold CRUDscaffold CRUD
Stap 4: creeer mini-applicatie Stap 4: creeer mini-applicatie (CRUD van één tabel uit ER)(CRUD van één tabel uit ER)
Generate -> scaffoldGenerate -> scaffold
Maakt Model – View – ControllerMaakt Model – View – Controller Veel feedback in het Output vensterVeel feedback in het Output venster
Stap 5: pas database aan (maak tabel van Stap 5: pas database aan (maak tabel van model)model) Migrate databaseMigrate database
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
Kijk even naar databaseKijk even naar database
title:string title:string attribuut title, type varchar(255) attribuut title, type varchar(255) id id int, autoincrement int, autoincrement
Altijd bij Rails modelAltijd bij Rails model Extra velden maken kan analoogExtra velden maken kan analoog
Bij scaffold opsomming zonder komma’s Bij scaffold opsomming zonder komma’s
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
Hoe? Hoe?
scaffold maakt ruby bestanden in scaffold maakt ruby bestanden in Database Migrations/migrate/… Database Migrations/migrate/…
up & down methodes om tabel te up & down methodes om tabel te maken en te verwijderenmaken en te verwijderen
Zet t.timestamps in commentaar #Zet t.timestamps in commentaar # Migrate databaseMigrate database
Eerst version 0 (drop) Eerst version 0 (drop) Dan version 1 Dan version 1
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
AfsprakenAfspraken i.v.m. i.v.m. naamgevingnaamgeving
Model is enkelvoud (post)Model is enkelvoud (post) elk object van het type model bevat 1 elk object van het type model bevat 1
modelmodel Tabel is meervoud (posts)Tabel is meervoud (posts)
Want tabel bevat verschillende postsWant tabel bevat verschillende posts
Ruby-tag <% %>Ruby-tag <% %>
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
Klaar is kees?Klaar is kees?
Stap 6: kijk even in http://localhost:3000Stap 6: kijk even in http://localhost:3000 Nog niet veel te zienNog niet veel te zien
Ziet er zo standaard uitZiet er zo standaard uit Kijk wel eens bij “About your applications Kijk wel eens bij “About your applications
environment”environment” ‘‘t Is echt jouw applicatie!t Is echt jouw applicatie!
Probleem: geen basis-actie gedefinieerd in Probleem: geen basis-actie gedefinieerd in config/routes.rbconfig/routes.rb
=> mooie URL’s=> mooie URL’s
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
““homepagina” makenhomepagina” maken
In het project, open het mapje “public” en In het project, open het mapje “public” en verwijder index.htmlverwijder index.html
Kijk opnieuw in http://localhost:3000Kijk opnieuw in http://localhost:3000 Routing error (da’s goed. index.html is weg!)Routing error (da’s goed. index.html is weg!)
Nieuwe route instellen in config/routes.rbNieuwe route instellen in config/routes.rb
En zie daar: een ‘volledige’ applicatie!En zie daar: een ‘volledige’ applicatie!
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
Let even op de urlsLet even op de urls
http://localhost:3001/postshttp://localhost:3001/posts http://localhost:3001/posts/newhttp://localhost:3001/posts/new
http://localhost:3001/posts/1http://localhost:3001/posts/1 http://localhost:3001/posts/1/edit http://localhost:3001/posts/1/edit
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
AfsprakenAfspraken i.v.m. i.v.m. naamgevingnaamgeving
Model is enkelvoud (post)Model is enkelvoud (post) Models/post.rbModels/post.rb
Tabel is meervoud (posts)Tabel is meervoud (posts) Controller is ook meervoud (posts)Controller is ook meervoud (posts)
Want toont lijst van postsWant toont lijst van posts Eigenlijk Controllers/posts_controller.rbEigenlijk Controllers/posts_controller.rb
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
Database aanpassenDatabase aanpassen
Niet rechtstreeks prutsen in 001_create_posts.rbNiet rechtstreeks prutsen in 001_create_posts.rb Want ongedocumenteerd, en moeilijke roll backWant ongedocumenteerd, en moeilijke roll back
Wel via Rails zelfWel via Rails zelf
Naam in CamelCase, Naam in CamelCase, en moet eindigen met tabelnaam en moet eindigen met tabelnaam (met hoofdletter)(met hoofdletter)
Gevolgd door attributen van tabelGevolgd door attributen van tabel
Wordt vertaald naar add_body_to_posts.rbWordt vertaald naar add_body_to_posts.rb Migrate Database …Migrate Database …
Of open bronbestand en rechterklik “Run” in editorOf open bronbestand en rechterklik “Run” in editor
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
View & Controller View & Controller aanpassenaanpassen
Ofwel zelfOfwel zelf De aangeraden methodeDe aangeraden methode
Ofwel nieuwe scaffoldOfwel nieuwe scaffold Generate Generate scaffold scaffold
post post title:string body:text --skip-migration title:string body:text --skip-migration + overwrite aanduiden+ overwrite aanduiden
Test en zie dat het werktTest en zie dat het werkt Merk op hoe het input-element in HTML Merk op hoe het input-element in HTML
afhankelijk is van het type van het attribuut in afhankelijk is van het type van het attribuut in het model het model
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
Declaratieve Declaratieve formuliervalidatieformuliervalidatie
Eigenlijk is verplichte aanwezigheid niks Eigenlijk is verplichte aanwezigheid niks van het formulier, maar van het modelvan het formulier, maar van het model cfr. null/not null in database-schemacfr. null/not null in database-schema
Validatie hoort dus thuis in model, niet in Validatie hoort dus thuis in model, niet in formulierformulier Open Models/post.rbOpen Models/post.rb Voeg toe aan klasse-definitieVoeg toe aan klasse-definitie
validates_presence_of :title, :bodyvalidates_presence_of :title, :body Test applicatie!Test applicatie!
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
Netbeans helpt!Netbeans helpt!
Je mag ook vp typen en op tab Je mag ook vp typen en op tab drukken)drukken)
Of typ validates_ en druk op ctrl-Of typ validates_ en druk op ctrl-spatiespatie
Oef: zorg er voor dat de titel minstens 5 lang Oef: zorg er voor dat de titel minstens 5 lang is is
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
View aanpassenView aanpassen
In ViewsIn Views Layouts: algemene schema van de paginaLayouts: algemene schema van de pagina Posts: bevat “includes” die horen bij het model Posts: bevat “includes” die horen bij het model
“post”“post” Komt in de <%= yield %> van de layoutKomt in de <%= yield %> van de layout
Naam is nu .html.erb (vroeger rhtml)Naam is nu .html.erb (vroeger rhtml) OefeningOefening
Verander <% for post in @posts %> in Verander <% for post in @posts %> in <% for post in @posts.reverse %><% for post in @posts.reverse %>
Voeg toe Voeg toe <em> <%= link_to 'Permalink', :action => 'show', :id => post <em> <%= link_to 'Permalink', :action => 'show', :id => post %></em>%></em>
Voeg wat meer vormgeving toe!Voeg wat meer vormgeving toe!
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
Ondersteuning ER-schema Ondersteuning ER-schema (1)(1)
Maak model voor elke entiteitMaak model voor elke entiteit Vooral aandacht voor cardinaliteitenVooral aandacht voor cardinaliteiten 1-N-relatie : 1-kant 1-N-relatie : 1-kant has_manyhas_many N-kant & N- N-kant & N-
kant kant belongs_tobelongs_to 1-kant 1-kant class Post < ActiveRecord::Baseclass Post < ActiveRecord::Base
belongs_to :author belongs_to :authorendend
class Author < ActiveRecord::Baseclass Author < ActiveRecord::Base has_many: post has_many: postendend
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
Ondersteuning ER-schema Ondersteuning ER-schema (2)(2)
1-1-relatie: hangt af van waar je verwijzing naar 1-1-relatie: hangt af van waar je verwijzing naar andere tabel stockeertandere tabel stockeert Bv. in Author verwijzing naar Portfolio, dan in Author Bv. in Author verwijzing naar Portfolio, dan in Author
“belongs_to :portfolio” en in Portfolio “has_one :author” “belongs_to :portfolio” en in Portfolio “has_one :author” belongs_to :belongs_to :objectobject voegt attribuut voegt attribuut objectobject_id toe!_id toe! N-M-relatie : N-M-relatie : has_and_belongs_to_manyhas_and_belongs_to_many aan beide aan beide
kantenkanten Maakt tabel voor N-M-relatieMaakt tabel voor N-M-relatie
http://www.netbeans.org/kb/60/ruby/model.htmlhttp://www.netbeans.org/kb/60/ruby/model.html Comment toevoegen aan post Comment toevoegen aan post doen! doen!
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
Speciale relatie: acts_as_listSpeciale relatie: acts_as_list
Zorgt voor lus doorheen belongs_to elementZorgt voor lus doorheen belongs_to element Als meer dan één belongs_toAls meer dan één belongs_to
:scope => “ :scope => “objectobject_id”_id” Voegt gedrag to: een lusVoegt gedrag to: een lus
class Post < ActiveRecord::Baseclass Post < ActiveRecord::Base belongs_to :Author belongs_to :Author acts_as_list :scope => “author_id” acts_as_list :scope => “author_id” end end … … auteur = Author.find 1 auteur = Author.find 1 auteur.posts.each {…} auteur.posts.each {…}
Plus nog verschillende andere methodesPlus nog verschillende andere methodes
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
Ruby voor viewRuby voor view
Standaard view aanpassen Standaard view aanpassen Vooral declaratiefVooral declaratief
image_tag(“url”, …)image_tag(“url”, …) link_to ‘link-titel’, { :action => link_to ‘link-titel’, { :action =>
‘methode’, :id => 17}‘methode’, :id => 17} :confirm => “vraag”:confirm => “vraag”
Dikwijls lussenDikwijls lussen
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
_partials _partials
““includes” om op verschillende includes” om op verschillende pagina’s te hergebruikenpagina’s te hergebruiken
Bestandje dat begint met underscoreBestandje dat begint met underscore
render :partial => 'name', :locals => render :partial => 'name', :locals => {:var1 => value, :var2 => value} {:var1 => value, :var2 => value}
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
Ruby lussenRuby lussen
<% for item in @items %><% for item in @items %>
… … (met (met itemitem))
<% end %><% end %>
<% @post do |f| %><% @post do |f| %>
… … (met (met f f ))
<% end %><% end %>
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
Ruby voor controllerRuby voor controller
Directe mapping tussen view-Directe mapping tussen view-bestand en controller-methodebestand en controller-methode
Methode vult @variabelen zodat view Methode vult @variabelen zodat view die kan gebruikendie kan gebruiken
Vooral findsVooral finds
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
Zoekfuncties Zoekfuncties (sql weg geabstraheerd)(sql weg geabstraheerd)
User .find(:first) User .find(:first) # => User object# => User object User .find(:all) User .find(:all) # => Array with all User # => Array with all User
objectsobjects User .find(3) User .find(3) # => User object with id 3# => User object with id 3
User .find(:all, conditions => User .find(:all, conditions => {:first_name => “Jamis”, :last_name => “Buck”}) {:first_name => “Jamis”, :last_name => “Buck”})
User .find(:all, conditions => “title like ‘d%’ ” )User .find(:all, conditions => “title like ‘d%’ ” ) Met variabelen: [] + ?Met variabelen: [] + ?
User .find(:all, [conditions => “title like ‘%?%’ ”, var1] )User .find(:all, [conditions => “title like ‘%?%’ ”, var1] )
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
Zoekfunctie (2)Zoekfunctie (2)
users = User .find(:all, users = User .find(:all, :conditions => [“users.id = :conditions => [“users.id =
taggings.taggable_id and users.age > ?”, 25],taggings.taggable_id and users.age > ?”, 25],:limit => 10,:limit => 10,:offset => 5,:offset => 5,:order => “users.last_name”,:order => “users.last_name”,:joins => “, tagggings”,:joins => “, tagggings”,:select => “count(*) as count, :select => “count(*) as count,
users.last_name”,users.last_name”,:group => “users.last_name”):group => “users.last_name”)
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
Ruby voor het modelRuby voor het model
Extra data members (naast db-dingen)Extra data members (naast db-dingen)attrattr_xxx @variabele_naam_xxx @variabele_naam
attr_accessor (rw), attr_read (r), attr_write (w)attr_accessor (rw), attr_read (r), attr_write (w) Extra methodesExtra methodes
def def methodemethode((param1, param2param1, param2) ) @var1 = param1@var1 = param1;;
end end
def to_string def to_string "Item #{@id} is a #{@type}: Price "Item #{@id} is a #{@type}: Price $#{@price}" $#{@price}" end end
Gebeurt eigenlijk niet zo (heel) veelGebeurt eigenlijk niet zo (heel) veel
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
Eigen formEigen form
Slide 209 en verderSlide 209 en verder
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
Javascript en Ajax Javascript en Ajax toevoegentoevoegen
http://www.onlamp.com/pub/a/onlamp/http://www.onlamp.com/pub/a/onlamp/2005/06/09/rails_ajax.html2005/06/09/rails_ajax.html
Ajax_scaffold_generatorAjax_scaffold_generator Slide 236 en verderSlide 236 en verder
WebTaVe 2007-’08WebTaVe 2007-’08Ruby On RailsRuby On Rails
Geavanceerde slidesGeavanceerde slides
http://www.slideshare.net/http://www.slideshare.net/peter_marklund/ruby-on-rails-101-peter_marklund/ruby-on-rails-101-presentation-slides-for-a-five-day-presentation-slides-for-a-five-day-introductory-courseintroductory-course