Ruby on Rails: Das MVC-Framework für komplexe Webanwendungen

2004 veröffentlichte das amerikanische Webentwicklungs-Unternehmen 37signals (heute Basecamp) die Projektmanagement-Anwendung Basecamp, die u. a. Features wie To-do-Listen, Time-Tracking oder ein Nachrichtensystem enthielt. Teil der Software war eine Basisarchitektur, die eigens zu diesem Zweck vom beteiligten Programmierer David Heinemeier Hansson erschaffen, aber noch im selben Jahr extrahiert und 2005 als eigenständiges und quelloffenes Web-Application-Framework veröffentlicht wurde. Der Name des in Ruby entwickelten und heute bestens bekannten Grundgerüsts: Ruby on Rails – kurz RoR oder auch einfach nur Rails. Dass sich das Framework, das mittlerweile durch ein mehrköpfiges Entwicklerteam betreut wird, einmal zu einer der gefragtesten Lösungen für die Kreation neuer Webanwendungen entwickeln würde, ahnte zu diesem Zeitpunkt wohl niemand.

Was ist Ruby on Rails?

Seit Ruby on Rails damals unter der MIT-Lizenz erschienen ist, haben die Entwickler das Framework stetig weiterentwickelt. Dabei ist man sich hinsichtlich der Philosophie bis heute treu geblieben: So gilt unverändert der Grundsatz „Don’t repeat yourself“ (DRY; dt. „Wiederhole dich nicht“). Jede Information soll in einem Projekt auf Basis des Rails-Frameworks also nur ein einziges Mal vorhanden sein. So reicht es z. B., die Spalten einer Tabelle nur in der Datenbank zu definieren, ohne diese Information auch im Quellcode oder in einer separaten Konfigurationsdatei festzuhalten. Das implementierte Modul Active Record liest selbige nämlich direkt aus der Datenbank.

Das zweite Design-Paradigma lautet „Convention over configuration“ (dt. „Konvention vor Konfiguration“). Das RoR-Framework gibt also bestimmte Konventionen vor, beispielsweise bei der Benennung von Klassen. Hält man sich als Entwickler an diese Konventionen, spart man eine Menge Konfigurationsaufwand. Ruby on Rails lässt allerdings auch alternative Konfigurationen zu, weshalb Ihnen die Flexibilität beim Programmieren Ihrer Web-App vollständig erhalten bleibt.

Ruby: Die flexible und plattformunabhängige Sprache des Rails-Frameworks

Mitte der 90er-Jahre veröffentlichte der Japaner Yukihiro Matsumoto die objektorientierte Sprache Ruby. Zunächst nahezu ausschließlich in Japan genutzt, hat sich die Skriptsprache mittlerweile weltweit als beliebte Alternative zu den Branchenführern PHP, Python und Co. etabliert. Von ungefähr kommt dieser Erfolg nicht: Matsumoto hat sich bei der Entwicklung nämlich vor allem zum Ziel gesetzt, den Spaß am Programmieren dauerhaft zu sichern und daher die besten Eigenschaften anderer Sprachen in Ruby vereint. Als interpretierte Skriptsprache wird der Code von einem Interpreter ausgeführt, was zwar gegenüber kompilierten Skripten einen kleinen Geschwindigkeitsnachteil bedeutet, Ruby auf der anderen Seite aber deutlich flexibler und dynamischer macht. Da für alle gängigen Betriebssysteme spezifische Interpreter existieren, ist Ruby-Code dank dieser Tatsache plattformunabhängig.

Ein ganz wesentliches Merkmal von Ruby ist die Multiparadigma-Fähigkeit, die z. B. auch C++ auszeichnet. Sie sind also nicht an ein bestimmtes Programmierparadigma gebunden. Dank des „Prinzips der geringsten Überraschung“ nutzen Sie die Skriptsprache intuitiv und – in der Regel – ohne auf unerwartetes Verhalten zu stoßen. Als Open-Source-Software unter der freien BSD-Lizenz erfreut sich Ruby einer großen und sehr aktiven Community, die zahlreiche aktuelle Programm-Bibliotheken beigesteuert hat, die zum Großteil ebenfalls dieser Lizenz unterliegen und eine große Rolle bei der Entwicklung moderner Webapplikationen spielen. Sie lassen sich mithilfe der sogenannten RubyGems installieren, nutzen und aktualisieren. Einer dieser Gems, zu denen beispielsweise auch die öffentlichen Web-APIs von Google und Facebook zählen, ist das Rails-Framework

Model-View-Controller-Architektur (MVC)

Ruby-on-Rails-Laufzeitumgebungen sind geschlossene Systeme. Sie enthalten den Interpreter, die notwendigen Programmbibliotheken sowie die jeweiligen Skripte. Jedes Rails-Projekt unterliegt einer automatisch erzeugten Verzeichnisstruktur, die Skripte, Konfigurationen, Klassen, Inhalte etc. voneinander trennt. Dank dieser strukturellen Vorgehensweise, Daten und deren Anpassungen sowie Darstellungsform getrennt zu verwalten, sind die Webanwendungen leicht zu pflegen. Man spricht auch von einer Model-View-Controller-Architektur, deren Schichten sich folgendermaßen beschreiben lassen:

Model

Für gewöhnlich sind Rails-Applikationen an relationale Datenbanken geknüpft. Um mit dem jeweiligen Datenbank-Management-System zu kommunizieren und Einträge anzufertigen bzw. zu manipulieren, benötigt das Ruby-Framework Models. Diese bilden Klassen auf eine Datenbanktabelle und einzelne Attribute auf die passenden Spalten ab. Die Model-Schicht basiert standardmäßig auf dem ORM-Framework (object-relational mapping) Active Record. Seit Rails 3.0 können Sie dank der implementierten Plug-in-API auch andere ORM-Bibliotheken wie Sequel nutzen.

Views

Die View-Schicht oder auch Präsentationsschicht benötigt das Framework, um auf die Daten aus der Model-Schicht zuzugreifen und diese visuell darzustellen. Zu diesem Zweck verwendet Ruby on Rails die Klasse Action View, die diverse Ausgabeformate unterstützt. In Form von HTML-Dokumenten gerendert, präsentieren Views die entsprechenden Daten beispielsweise dem anfragenden Benutzer. XML- oder JSON-Dokumente dienen dazu, den Zugriff auf die Datenbankeinträge für andere Programme oder Dienste verfügbar zu machen.

Controller

Controller stellen die Schnittstelle zwischen der Model- und der View-Schicht dar. Sie verarbeiten die ankommenden Anfragen durch den Webbrowser, rufen die entsprechenden Models von der Datenbank ab und leiten sie an die Views weiter, die für die Visualisierung sorgen. Als zentrale Steuereinheiten der Rails-Applikation verwalten Controller außerdem auch das Caching-Verhalten oder fassen unterschiedliche Anfragen eines einzelnen Clients, die über einen Zeitraum hinweg getätigt werden, in einer Session zusammen.

Die Standardkomponenten des RoR-Frameworks

Als Framework für Webapplikationen stellt Ruby on Rails bereits in der Standardkonfiguration alle Komponenten zur Verfügung, die Sie als Entwickler benötigen, um eine funktionsstarke Anwendung zu programmieren. Die einzigen zusätzlichen Voraussetzungen sind, dass Ruby und der Paketverwalter RubyGems sowie eine SQL-Datenbank installiert sind. Für letztgenannte empfiehlt das Rails-Team die in C geschriebene Open-Source-Programmbibliothek SQLite, die ein relationales Datenbanksystem enthält. Das sind die Standardmodule des Ruby-on-Rails-Frameworks:

  • Action Controller: Mithilfe des Moduls Action Controller erstellen Sie die erwähnten Schnittstellen zwischen den Datenbankeinträgen und den zugreifenden Benutzern und Programmen.
  • Action View: Action View bietet Ihnen die Möglichkeit, Views für die einzelnen Einträge und Controller zu erzeugen. Hinsichtlich der Namensgebung existiert die Konvention, dass alle Views nach dem jeweiligen Controller benannt sein müssen.
  • Active Record: Bei Active Record handelt es sich um das zentrale Modul zur Manipulation der Datenbank Ihrer Rails-Anwendung. Um mit diesem die einzelnen Models zu erzeugen, müssen Sie nur wenig konfigurieren, wenn Sie sich an die Konventionen bezüglich Benennung und Schema halten. Ruby on Rails bietet zu diesem Zweck mithilfe des mächtigen Scaffolding-Systems (dt. „Gerüstbau“) das optimale Werkzeug, um Interfaces für die vier CRUD-Operationen zu erzeugen, die den Datenbestand auf objektorientierter Ebene präsentieren.
  • Active Resource: Dieses Modul implementiert die objektrelationale Abbildung (ORM) für REST-Webservices. Wie Active Record konzentriert sich auch diese Komponente darauf, Konfigurationen einzusparen.
  • Action Mailer: Action Mailer erlaubt es, in Ihrer Webanwendung E-Mails zu versenden und zu erhalten. Auf diese Weise können Sie unkompliziert eine E-Mail-Registrierung und -Anmeldung einrichten.
  • Active Support: Das Modul Active Support enthält verschiedene nützliche Hilfsprogramm-Klassen und Standard-Bibliothek-Erweiterungen.
  • Railties: Damit alle Komponenten des RoR-Frameworks im Verbund funktionieren, existieren die sogenannten Railties. Jedes Modul hat aus diesem Grund sein eigenes Railtie implementiert, um beispielsweise den Initialisierungsprozess zu starten oder Konfigurationen am Framework vornehmen zu können. Railties sind außerdem notwendig, um Ruby on Rails eigene Module hinzuzufügen.

Ruby on Rails: Vor- und Nachteile des Webframeworks

Auf wikibooks.org findet man folgenden Witz über die Frage nach der besten Skriptsprache:

  • Zwei Entwickler unterhalten sich über Programmiersprachen. Der Erste: „Ich arbeite mit Java, PHP gebe ich meinen Kindern zum Spielen.“ Daraufhin der zweite: „Ich spiele mit meinen Kindern und lasse Ruby für mich arbeiten!“

Natürlich steckt in diesem Witz eine gehörige Portion Übertreibung, doch im Grunde auch ein wahrer Kern. Java gilt für komplexe Lösungen als erstklassige Wahl und kommt deshalb in vielen Frameworks im Business-Bereich zum Einsatz. Mit der plattformunabhängigen Sprache zu programmieren ist allerdings aufgrund der oftmals sehr komplexen Struktur alles andere als einfach und in der Regel sehr aufwendig und mit einem hohen Zeitfaktor verbunden. Ruby ist als interpretierte Skriptsprache ebenfalls an keine bestimmte Plattform gebunden. Gleichzeitig ist ein Code mit Ruby wesentlich schneller geschrieben, leichter anpassbar und von deutlich geringerem Umfang. Die Interpretersprache sorgt allerdings auch dafür, dass die Geschwindigkeit entwickelter Applikationen langsamer ist als bei vergleichbaren Java-Anwendungen.

Auch PHP hat im Vergleich zu Java deutliche Vorteile in Sachen Simplizität und Entwicklungsaufwand. In der Webentwicklung gilt die Sprache nicht von ungefähr als etablierte Standardlösung, die u. a. die Grundlage diverser Content-Management-Systeme wie WordPress, TYPO3 oder Joomla bildet. Aufgrund der Tatsache, dass PHP eher willkürlich zusammengestellt und nicht immer objektorientiert war, gestalten sich Upgrades von Webapplikationen, die mit älteren Versionen entwickelt worden sind, mitunter allerdings ziemlich mühsam. Ruby on Rails war von Beginn an vollständig objektorientiert, weshalb Anwendungen, die mithilfe älterer Versionen programmiert sind, standardmäßig saubereren Code enthalten als vergleichbare PHP-Projekte.

Ruby on Rails enthält ein integriertes Framework, mit dessen Hilfe Sie die Funktionsfähigkeit Ihrer Applikation jederzeit testen können. Fehler lassen sich dank dieser Möglichkeit von Anfang an feststellen und beheben. Web-2.0-Techniken wie AJAX sind von Werk aus mit wenigen Zeilen nutzbar. Darüber hinaus erfreuen sich Ruby und das Rails-Framework einer riesigen und stetig wachsenden Community, wie auch die gewaltige Auswahl an Erweiterungen unter Beweis stellt.

Die innovative Philosophie von Rails – das Streben nach der größtmöglichen Vereinfachung für den Entwickler –, die Matsumoto mit Features wie dem Scaffolding-System, festen Konventionen oder der MVC-Struktur von Beginn an verfolgt hat, diente zudem vielen neueren Frameworks als Vorbild. So findet sich der Ansatz u. a. in den PHP-Frameworks Symfony, CakePHP und im Zend Framework wieder.

Für wen eignet sich das Ruby-Framework?

Ruby on Rails bietet alles, was ein Entwickler zur Kreation moderner Webapplikationen benötigt: Erstklassige Strukturen zur Realisierung des Interfaces, eine leicht einzurichtende Anbindung an eine SQL-Datenbank sowie die Möglichkeit, Webtechnologien wie AJAX einzusetzen. Die klaren Prinzipien „Don’t repeat yourself“ und „Convention over configuration“ liefern die Basis für sauberen, leicht überschaubaren und gut anpassbaren Code, der schnell geschrieben ist. Eigene Konfigurationen sind dennoch problemlos möglich, denn Ruby soll einem Programmierer alle Freiheiten bieten, die er benötigt. Damit ist das Framework sowohl für Neulinge, als auch für erfahrene Programmierer, die bis dato mit anderen Skriptsprachen gearbeitet haben, geeignet – auch wenn in beiden Fällen ein gewisser Zeitaufwand für den Einstieg eingeplant werden sollte.

Dank des Scaffolding-Systems sind Prototypen geplanter Webprojekte in kürzester Zeit realisiert – hier liegt eindeutig eine der großen Stärken des Ruby-Frameworks. Dank der integrierten Testumgebung überprüfen Sie Ihre Anwendung schon während der Entwicklungsphase auf mögliche Fehler. Auch für komplexe Applikationen zeigt sich Ruby on Rails gerüstet. Mithilfe der RubyGems genannten Erweiterungen, zu denen das Framework im Übrigen selbst zählt, fügen Sie benötigte Schnittstellen, Bibliotheken oder funktionale und optische Features problemlos hinzu. Da Ruby und das RoR-Framework der freien BSD-Lizenz unterliegen, entstehen für Sie durch die Nutzung einzig Kosten für das Hosting Ihres Webprojekts.

Sie sollten aber nicht davon ausgehen, dass Sie für Ruby on Rails über keinerlei Programmierfähigkeiten verfügen müssen. Die komplette Arbeit, wie es der Ruby-Entwickler im obigen Witz behauptet, nimmt Ihnen die Skriptsprache natürlich nicht ab. Hinsichtlich der Geschwindigkeit können die entwickelten RoR-Anwendungen nicht gänzlich mit der Konkurrenz mithalten. Der Code wird erst ausgeführt, wenn Benutzer auf den jeweiligen Inhalt zugreifen, weshalb die Bearbeitung der eingehenden Anfragen logischerweise etwas länger dauert als bei vorkompilierten Codezeilen.

Ferner müssen Sie auf einen Einsatz des Rails-Frameworks verzichten, wenn Sie Ihre Applikation mit Content-Management-Systemen wie Drupal, Joomla oder WordPress organisieren wollen. Die genannten Beispiele basieren, wie viele andere Plattformen auch, auf PHP. Es existieren aber auch bereits CMS-Lösungen auf Basis von Ruby on Rails wie z. B. Alchemy CMS. Prognosen über die Verbreitung von RoR und die Chance, den Status der Marktführer PHP, Java und Python zu gefährden, lassen sich nur schwer anstellen – die Vorzüge und steigende Beliebtheit des Ruby-Frameworks sprechen jedoch durchaus für sich.