# Ruby on Rails

Ruby on Rails, ook vaak RoR of eenvoudigweg Rails genoemd, is een opensource-webapplicatieframework, geschreven in Ruby. Het volgt in grote lijnen het model-view-controller-model. Het streeft naar eenvoud en staat het toe praktische applicaties te ontwikkelen met minder code en minder configuratie dan andere raamwerken. De Ruby-programmeertaal geeft de mogelijkheid tot meta-programmeren waarvan Rails veel gebruikmaakt. Dit resulteert in programmeercode die vaak goed leesbaar is en eenvoudig te begrijpen valt.

## Geschiedenis

Ruby on Rails werd door David Heinemeier Hansson uit zijn werk aan het projectmanagementpakket Basecamp geëxtraheerd. Het werd uitgebracht voor het publiek in juli 2004. Sinds het openbaar maken van de broncode zijn er medio 2015 door meer dan 4000 ontwikkelaars bijdragen geleverd aan Ruby on Rails.

## Filosofie

De twee hoofdprincipes van Ruby on Rails zijn
* "Don't repeat yourself" (DRY), ofwel "Herhaal jezelf niet" (active record patroon) en
* "Convention over configuration" (COC), ofwel "conventies boven configuratie".
DRY betekent dat definities slechts eenmaal gemaakt hoeven te worden. Ruby on Rails biedt uitgebreide mogelijkheden om op de juiste plaats, eenmalig een stukje te programmeren, waarna het beschikbaar is in de juiste plaatsen in heel de applicatie. Hiermee kan redundantie zeer eenvoudig voorkomen worden.
COC betekent dat de programmeur enkel afwijkende configuraties hoeft door te voeren. Als een programmeur bijvoorbeeld een specifieke modelklasse aanmaakt genaamd Computer, dan weet Ruby on Rails dat het bij de tabel computers van de database hoort. Wil de programmeur echter dat de tabel machines gebruikt wordt voor de klasse Computer (bijvoorbeeld om een extern, bestaand systeem te koppelen), dan moet dat worden aangegeven in de configuratie. Hierdoor worden automatisch consistentere en eenvoudigere applicaties geschreven, daar de programmeur extra werk moet uitvoeren om af te wijken van die consistente "conventies".
Daarnaast wordt bij Ruby on Rails sterk gefocust op agile-softwareontwikkeling en is Behaviour Driven Development populair binnen de Rails community.

## Software-architectuur

Zoals genoemd maakt Rails gebruik van het model-view-controller-modelprincipe. Het model is vaak een tabel van een database, waarbij eenvoudigweg de naamgeving van de klasse voldoende is om het te koppelen aan een tabel. Meestal bevat de klassedefinitie ook verwijzingen naar andere tabellen en validatieregels. Overigens hoeft een model niet altijd een databasetabel te representeren.
De controller is een klasse die de applicatielogica bevat en de operaties definieert die gebruiker kan aanroepen. Wanneer er gebruikgemaakt wordt van de standaardinstellingen van Rails kan een gebruiker een operatie benaderen met http://eenservernaam/controllernaam/operatienaam. Tijdens de operatie wordt vaak informatie verzameld om weer te geven in de view of om invoer van gebruikers te verwerken.
De view is de definitie in HTML van een controlleroperatie. Met behulp van de Embedded Ruby syntaxis kan Ruby-code ingevoegd worden, waarbij de view binnen de context van het controllerobject wordt aangeroepen. Een view kan overigens ook een XML-definitie of afhandeling van een JavaScript-operatie bevatten. Dit laatste wordt met name gebruikt voor Ajaxdoeleinden.
Een typische Rails operatie gaat als volgt:
* De webserver ontvangt een URL en deze wordt vertaald in een controller en een operatie. Zogenaamde routering.
* Er wordt een controllerobject gecreëerd. Van dit object wordt de opgegeven controlleroperatie aangeroepen.
* Gedurende een controlleroperatie wordt een modeloperatie uitgevoerd. Meestal wordt er een transactie uitgevoerd op een database.
* De controller verwerkt eventueel het resultaat van het model.
* De view, gelijk aan de naam van de controlleroperatie, wordt gerenderd (HTML generatie).
* De gerenderde (HTML) inhoud wordt verstuurd naar de webbrowser.
Er zijn ook varianten hierop mogelijk, maar de eerste stap (routeren) en tweede stap (controlleroperatie) worden altijd uitgevoerd.

### Componenten

Ruby on Rails is opgebouwd uit de volgende componenten:
* ActiveSupport - Dit bevat aanvullingen op de standaard Ruby-bibliotheek. Dit is ook buiten Rails te gebruiken. Het bevat bijvoorbeeld de UTF-8 ondersteuning, wat de standaard implementatie van Ruby vrijwel ontbeert.
* ActiveRecord - Deze component zorgt voor de ondersteuning van databases en bijhorende operaties. Men kan hiermee de modellen van een Rails applicatie realiseren. Met ActiveRecord kan een grote mate van abstractie gerealiseerd worden waarbij de keuze van de onderliggende type database bijna niet meer uitmaakt. Het is nog steeds mogelijk om directe SQL-operaties uit te voeren, maar het wordt aangeraden om dit te voorkomen als men een database-platform-onafhankelijke applicatie wil ontwikkelen. ActiveRecord kan ook gebruikt worden buiten het Railsraamwerk.
* ActionController - Met deze component kan men de controller realiseren. Daarnaast bevat het onder andere ondersteunende functionaliteit zoals routering, sessiebeheer en caching.
* ActionView - Deze component bevat hulpmiddelen om views te realiseren. Hieronder vallen bijvoorbeeld functies om web-forms te maken en daarnaast functionaliteit om Ajax-constructies te realiseren.
* Optionele componenten, maar wel onderdeel of voorheen onderdeel van het raamwerk, zijn:
** ActionMailer (voor e-mail-functionaliteit) en
** ActionWebService (voor SOAP en XML-RPC ondersteuning). Deze component is sinds versie 2.0 niet meer standaard beschikbaar voor Rails.

## Gebruik

Als men Rails geïnstalleerd heeft is alleen het commando rails beschikbaar. Hiermee kan een Rails-applicatieraamwerk worden gegenereerd. Hiermee wordt een standaard directorystructuur aangemaakt waarin al wat logica gedefinieerd is en zijn de locaties gereserveerd waar de modellen, controllers en views geplaatst kunnen worden. Daarnaast wordt er al een structuur gedefinieerd waarin men later testscripts kan plaatsen. Deze structuur kan ook vervangen worden voor een ander framework, zoals Rspec.
Het toevoegen van modellen, controllers en views kan worden gedaan met behulp van de gegenereerde scripts, waarmee lege klassen en testscripts kunnen worden gegenereerd. Men kan bijvoorbeeld ook een zogenaamde scaffold (bouwsteiger) genereren voor een opgegeven model waarvoor specifieke controllers en views gegenereerd worden. Na het starten van de webserver kunnen met behulp van een webbrowser al basale databaseacties uitgevoerd worden.
Met de genoemde gegenereerde scripts kan men behalve structuren genereren en een webserver starten, ook debuggen met behulp van IRB (een interactieve ruby shell) en prestatiemetingen doen. Daarnaast kunnen er onderhoudstaken uitgevoerd worden met behulp van Rake (een make-achtig hulpmiddel) waarmee, onder andere, zogenaamde databasemigraties uitgevoerd kunnen worden.
Voor Rails kunnen verschillende webservers gebruikt worden. Een van de manieren voor Rails hosting is momenteel Phusion Passenger, een module voor Apache en nginx. Voor ontwikkeling wordt in het algemeen WebRICK – een webserverraamwerk dat met Ruby wordt meegeleverd – als server gebruikt omdat veranderingen in de code meteen ook uitvoerbaar zijn met een behulp van een webbrowser. Voor productie wordt behalve Passenger vaak een combinatie van Mongrel – een voor Rails geoptimaliseerde webserver – met Apache als frontend of Lighttpd gebruikt.

## Trivia

* DigiD, Groupon en NPO Gemist voor de iPhone zijn geschreven in Ruby on Rails.
Verder is het spel Blades of Legends grotendeels geschreven in Ruby on Rails. Ook Twitter is deels geschreven in Ruby on Rails.