Anzeige
Anzeige
UX & Design
Artikel merken

Rails-Einstieg für PHP-Entwickler: Unterwegs von PHP nach Rails

Seit 2005 der Siegeszug von Ruby on Rails, kurz Rails, begann, schielen immer mehr altgediente PHP-Entwickler mit einem Auge auf das agile Web-Framework und fragen sich, ob sie sich nicht auch mal auf die Schienen schwingen und einen Versuch mit Rails wagen sollen. Die abschreckende Hürde dabei ist wohl die Aussicht, eine neue Programmiersprache lernen zu müssen und das über die Jahre in PHP angesammelte Wissen bei der täglichen Arbeit an Webanwendungen nicht mehr nutzen zu können. Der Artikel bringt PHP-Entwicklern Rails näher und soll dazu ermuntern, einen Blick über den PHP-Tellerrand zu werfen.

11 Min. Lesezeit
Anzeige
Anzeige

Ruby on Rails ist, wie sein Entwickler David Heinemeier Hansson schrieb, „ein Framework, das die Entwicklung, Auslieferung und Pflege von Web-Applikationen vereinfacht”. Statt sich beim Aufbau einer Webanwendung mit einer Sammlung aus PHP-Funktionen, SQL-Statements oder JavaScript-Funktionen herumzuschlagen und jedes Mal von vorne zu beginnen, integriert Rails die typischen Komponenten einer Webanwendung – wie HTML-Formulare oder das Lesen, Anlegen und Aktualisieren von Daten in einer Datenbank – in ein elegantes objektorientiertes Framework.

Ruby…

Anzeige
Anzeige

Rails wurde in der Programmiersprache Ruby entwickelt. Das Werkzeug für die Entwicklung von Anwendungen in Rails ist die Programmiersprache Ruby, die in den 90er Jahren vom Japaner Yukihiro Matsumoto, genannt „Matz“, entwickelt wurde. Ruby ist eine objektorientierte Skriptsprache und zeichnet sich durch eine gute Lesbarkeit aus. Auch wenn Sie nie Ruby gelernt haben, verstehen Sie den folgenden Ruby-Code auf Anhieb:

5.times { print „Ein Satz in Ruby!“ }

Wie aufwändig erscheint dagegen dieselbe Funktionalität in PHP:

for ($i = 0,$i < 5,$i++){ echo “Ein Satz in PHP!”;}

Ruby folgt dem „Prinzip der kleinsten Überraschung“. Unbekannte Objekte und Methoden sollen in ihren Parameter-Anforderungen vorhersehbar sein. Als PHP-Entwickler werden Sie das schnell schätzen lernen. In Ruby ist alles ein Objekt. Es gibt keine trivialen Datentypen für Zeichenketten oder Ganzzahlen, sondern Objekte, die von Haus aus einen ganzen Sack voller nützlicher Methoden zur Bearbeitung des Inhalts einer Variable mitbringen. Ein kleines Beispiel, das die Länge eines Strings ausgeben soll:

Anzeige
Anzeige
RUBY
teststring = "Test"
puts teststring.length

Listing 1

PHP
$teststring = "Test";
echo strlen($teststring);

Listing 2

Besonders praktisch wird es in Ruby, wenn man mehrere Funktionsaufrufe hintereinander aufrufen möchte (da es in Ruby nur Objekte gibt, gibt es auch keine „alleine“ stehenden Funktionen, sondern nur Methoden eines Objekts). In PHP müsste man diese verschachteln und eines der nur schwer wartbaren „Klammermonster“ erstellen, Ruby kann Methoden verketten und hintereinander vearbeiten. Das folgende recht sinnfreie Beispiel wandelt den String zuerst in Groß-, dann in Kleinbuchstaben um und gibt anschließend die Länge aus:

Anzeige
Anzeige
EIN VERGLEICH
Ruby: echo teststring.upcase.downcase.length
PHP: echo strlen(strtoupper(strtolower($teststring)));

Listing 3

Eine Übersicht, welcher Ruby-Code einer gewohnten PHP-Funktion entspricht, findet sich unter [1] mit vielen Beispielen für Umsteiger.

…on Rails

Rails wurde im Jahre 2004 von David Heinemeier Hansson für die Web-Anwendung Basecamp entwickelt [2], nach Fertigstellung der Anwendung von dem Produkt abstrahiert und als Open-Source-Anwendung veröffentlicht. Ursprünglich hatte Heinermeier Hansson sogar versucht, Rails in PHP zu entwickeln. Da ihm das aber nicht gefiel,
machte er sich auf die Suche nach einer Alternative und kam über die
„Pragmatic Programmer“ [3] um Martin Fowler auf Ruby. Rails gilt heute als die „Killer-Anwendung” für die Sprache Ruby und verhalf ihr zu plötzlicher Popularität. Rails verfolgt dabei verschiedene Grundsätze, die man für eine produktive Anwendung des Frameworks akzeptieren sollte.

Anzeige
Anzeige

Das MVC-Prinzip

Rails hält sich an die Prinzipien des MVC-Paradigma [4]. Die Festlegung auf das MVC-Modell entscheidet, wo welcher Code zu stehen und wie der grundlegende Ablauf einer Anwendung zu sein hat. Das mögen Sie zunächst als Einschränkung Ihrer Freiheit beim Programmieren empfinden. Sie gewinnen aber dabei. Ihre Anwendungen sind besser geplant und durchdacht, da Sie sich den „Zwängen“ des MVC-Modells anpassen müssen. Sie werden Ihre eigenen und fremde Anwendungen (auch nach einigen Monaten) besser verstehen. Der „Gewinn“ an Konsistenz wiegt den „Verlust“ an Freiheit in der Entwicklung auf und ermöglicht erst die zahlreichen Automatismen, die Rails für typische Web-Anwendungen eingebaut hat.

„Convention over Configuration“

Der Rails-Grundsatz lautet: „Wir halten uns an Konventionen und sparen uns dafür Konfiguration“. So setzt Rails eine Datenbank-Tabelle automatisch in eine Klasse um, ohne dass weitere Konfigurationen notwendig sind und verlangt dafür die Einhaltung gewisser Konventionen, zum Beispiel muss in jeder Tabelle ein eindeutiges Feld namens „id“ enthalten sein. Die Belohnung: Nur durch Definition eines Felds in einer Datenbanktabelle steht dieses als Eigenschaft in Ihrer Rails-Anwendung zur Verfügung.

DRY – „Don’t Repeat Yourself“

Das „Wiederhole-Dich-nicht“-Prinzip fordert, dass jede Funktion Ihrer Anwendung nur einmal geschrieben und dann bei Bedarf in Ihrer Anwendung wieder verwendet wird. So würde zum Beispiel nicht in jedem HTML-Template der Code für die Formatierung eines Datums in deutscher Schreibweise wiederholt, sondern dieser Code als Methode spezieller Helper-Objekte erstellt, die in Ihrer Anwendung zur Verfügung stehen.

Anzeige
Anzeige

Gründe für Ruby

Rails ist nicht einfach nur ein MVC-Framework für Web-Anwendungen, das man in jeder Sprache nachbauen könnte. Das wird zwar vielfach versucht, aber gestandene Rails-Entwickler können über PHP-MVC-Frameworks wie CakePHP oder Symfony nur milde lächeln. Rails ist Rails, weil es in Ruby implementiert wurde und die von der Programmiersprache zur Verfügung gestellten Möglichkeiten ausnutzt. Essenzielle Funktionalitäten wie „Migrations” müssen in gängigen PHP-MVC-Frameworks erst über Plugins „angeflanscht” werden. Rails realisiert viele seiner Funktionalitäten mit der Fähigkeit von Ruby zur Modifizierung und Erstellung von Eigenschaften und Methoden zur Laufzeit – Dinge, die bei Web-MVC-Frameworks in anderen Sprachen gar nicht vorhanden sind oder über aufwändigere Wege realisiert werden müssen.

Gut für Einsteiger: Sie können mit ihren Ruby-Kenntnissen in das Rails-Framework hinein wachsen, eine Hand voll erster Ruby-Kenntnisse reicht aus, um loslegen zu können.

Los geht’s

Anleitung zur Installation von Ruby On Rails auf den gängigen Systemen Mac OS X, Linux und Windows gibt es zuhauf im Internet, unter anderem auch auf der Website der Autoren [5]. Nachdem Ihre Entwicklungsumgebung lauffähig ist, kann es direkt mit einem ersten Projekt losgehen – einer kleine ToDo-Verwaltung. Diese ist in ihrer Datenbank-Komplexität eher einfach, aber dafür verwendet sie viele verschiedene Rails-Technologien.

Anzeige
Anzeige

Rails-Projekt anlegen

Rufen Sie die Kommandozeile (Terminal) auf und tippen Sie „rails testprojekt -d mysql“ ein. Der Befehl erstellt ein neues Rails-Projekt mit dem Namen „testprojekt“. Der Parameter „-d“ ist notwendig, damit MySQL als Datenbank verwendet wird – ohne würde SQLite3 verwendet. Daraufhin wird ein neuer Ordner „testprojekt“ erstellt, der alle nötigen Dateien Ihres Rails-Projekts enthält. Das wirkt zu Beginn etwas verwirrend, aber jeder Unterordner hat seine Berechtigung. Wechseln Sie in den Ordner „testprojekt“. Um zu sehen, ob alles funktioniert, können sie jetzt schon mal den Entwicklungsserver starten, ebenfalls über die Konsole per „ruby script/server“. Ohne weitere Parameter wird damit der Webserver „Mongrel“ auf Port 3000 gestartet. Überprüfen Sie im Webbrowser durch die Eingabe von „localhost:3000“, ob Sie folgendes sehen:

Wenn ja, können Sie den Server wieder stoppen und mit einem Editor ihrer Wahl das Projekt öffnen. Aptana [6] etwa läuft auf allen drei großen Plattformen und unterstützt sowohl eine Baumstruktur als auch die Ruby-Syntax. Rails kennt jeweils drei Umgebungen: Entwicklungs-, Test- und Produktionssystem, die normalerweise jeweils eine separate Datenbank verwenden. Für dieses kleine Beispiel soll die Entwicklungsdatenbank verwendet werden. Öffnen Sie dazu die Datei „config/database.yml“ und tragen Sie im Abschnitt „development“ Ihre Zugangsdaten zur MySQL-Datenbank sowie den Namen der Datenbank ein, die Sie für Ihr Rails-Projekt angelegt haben.

Ausgaben erstellen

Bisher haben Sie nur Einstellungen angepasst, aber nun geht‘s an die Ausgaben. Zuerst brauchen Sie ein „model“ sowie einen „controller“ – das M und C in MVC. Für ein schnelles Erfolgserlebnis nutzen Sie die „scaffold“-Methode in Rails, die auch gleich den „View“ erstellt:

Anzeige
Anzeige
SHELL
„ruby script/generate scaffold Item title:string description:text done:boolean“.

Listing 4

Damit haben Sie jetzt ein Model namens „Item“ erstellt, das eine Tabelle namens „items“ erwartet, mit den Datenbankfeldern „title“ als string, „description“ als Text sowie „done“ als Boolean-Feld. Zudem wurde bereits ein Controller erstellt, über den Sie ihre Einträge verwalten können: Anschauen, ändern, neu anlegen und löschen, auch CRUD genannt (create, read, update, delete). Sie können diese Funktionen jedoch noch nicht benutzen, da ihre MySQL-Datenbank ja noch nichts von ihrer gewünschen Tabelle „items“ weiß.

Aber das kann bei Rails recht einfach geändert werden, da es so genannte „Migrations“ verwendet, um Datenbanktabellen zu erstellen bzw. zu ändern. Das hat den Vorteil, dass die Rails-Anwendung weiß, welche Migrationen sie noch durchführen muss, man kann notfalls auch einen oder mehrere Schritte zurück gehen. Viele PHP-Entwickler werden es kennen: Datenbankfelder werden von Hand geändert und wenn die Änderungen im PHP-Code dann auf den Server gespielt werden, funktioniert das eine oder andere nicht, weil dort die Datenbank nicht geändert wurde. Rails übernimmt das und stellt eine „Historie“ der DB-Struktur zur Verfügung.

Die erste Migrationsdatei, die nun erstellt wurde, liegt unter „db/migrate/xxx_ceate_items.rb“, wobei „xxx“ der aktuelle Timestamp bei Ausführung des Befehls ist.

Anzeige
Anzeige
RUBY
class CreateItems < ActiveRecord::Migration
	def self.up
		create_table :items do |t|
			t.string :title
			t.text :description
			t.boolean :done
			t.timestamps
		end
	end

	def self.down
		drop_table :items
	end
end

Listing 5

Betrachten Sie den Code: Es gibt dort eine up- (Tabelle erstellen) und eine down-Methode (Tabelle löschen), die genau diese Schritte nachvollziehbar in Ruby-Syntax abbilden. Die Zeile „t.timestamps“ erstellt automatisch ein „created_at“- und „updated_at“-Feld in Ihrer Tabelle, ein Teil der Rails-Magie. Diese werden beim Anlegen bzw. beim Aktualisieren eines Datensatzes automatisch mit der aktuellen Zeit befüllt. Mit einem „rake db:migrate“ auf der Kommandozeile können Sie erreichen, dass Ihre Datenbank auf den aktuellen Stand Ihrer Migrationen gebracht wird. „rake“ („Ruby-Make“) ist dabei ein Befehl, mit dem Sie in Rails einiges machen können, „db:migrate“ ist nur eine Variante. Eine vollständige Übersicht aller Optionen erhalten sie mit „rake -T“.

Wenn Sie den Server wieder starten („script/server“) und im Browser „http://localhost:3000/items“ aufrufen, können Sie bereits Ihre ersten Einträge anlegen und speichern. Und das, ohne eine Zeile SQL geschrieben zu haben.

Bereits nach wenigen Zeilen Code steht eine erste Rails-Applikation, die alle eingegebenen ToDos auflistet.

Bereits nach wenigen Zeilen Code steht eine erste Rails-Applikation, die alle eingegebenen ToDos auflistet.

Wie Sie auf dem Screenshot sehen, werden alle Punkte aufgelistet, egal ob sie erledigt sind oder nicht. Das ist aber recht unschön, bei mehreren erledigten Einträgen geht schnell die Übersichtlichkeit darüber verloren, was noch zu tun ist. Die Ausgabe von offenen Punkten ist aber recht einfach anzupassen.

Anzeige
Anzeige

Öffnen Sie die Datei „app/controller/items_controller.rb“ und suchen Sie dort die Methode „index“ (alles zwischen „def“ und „end“). Wenn Sie die Zeile „@items = Item.find(:all)“ in „@items = Item.find(:all, :conditions => {:done => false})“ ändern, werden ab sofort nur unerledigte Dinge ausgegeben. Der Controller steuert also, welche Daten ausgegeben werden und diese Zeile wird in folgendes SQL umgesetzt (zu sehen über die Konsole, die Sie noch geöffnet haben sollten):

SQL
SELECT * FROM `items` WHERE (`items`.`done` = 0)

Listing 6

Im Moment können Sie auch leere Datensätze speichern, versuchen Sie es mal. Da dies nicht sinnvoll ist, sollten Sie die Anwendung so abändern, dass wenigstens der Titel ausgefüllt sein muss. Formularvalidierungen in reinem PHP können ganz schön nervig sein, in Rails erledigt das ein Einzeiler für Sie. Öffnen Sie das Item-Model unter „app/models/item.rb“. Wenn Sie dort die Zeile

RUBY
validates_presence_of :title

Listing 7

zwischen „class“ und „end“ ergänzen und danach nochmal versuchen, einen leeren Datensatz zu speichern, wird Rails eine Fehlermeldung ausgeben:

Die Applikation gibt bei leerem Titel eine Fehlermeldung aus.

Die Applikation gibt bei leerem Titel eine Fehlermeldung aus.

Die Fehlermeldung wird zunächst nur in Englisch ausgegeben. Ab Rails 2.2 werden Internationalisierungen einfacher zu handhaben sein, solange hilft ein Plugin [7].

Aussehen

Ihre Ein- und Ausgabeseiten sehen jetzt vielleicht nicht besonders hübsch aus, aber da alles per HTML und CSS gesteuert werden kann, ist das recht leicht anzupassen. Wichtig ist, dass alle Dateien im Order „public“ per Webserver erreichbar sind, also Stylesheets und Bilder dort in den entsprechenden Ordnern liegen. Die bisher verwendete CSS-Datei namens „scaffold.css“ liegt hier ebenfalls. Der „Rahmen“ der Anwendung, also das, was auf jeder Seite gleich sein soll, wird im Ordner „app/views/layouts“ abgelegt. Der Scaffold-Befehl hat hier schon eine „items.html.erb“-Datei für Sie angelegt. „Erb“ steht für „embedded ruby“ und ist eigentlich mit PHP direkt in HTML vergleichbar, nur mit einer anderen Schreibweise. Was in PHP die Fragezeichen, sind in Erb Prozentzeichen – eine Variable wird also über <%= variable %> ausgegeben.

Mitten in diesem Layout finden Sie den Baustein „<%= yield %>“. Genau dort werden die Untertemplates für jede Action ausgegeben, die sich für unsere ToDo-Liste dann im Ordner „app/views/items/“ befinden. Mit etwas Fantasie können Sie ihre Anwendung „aufhübschen“.

Controller und weitere Ausgabeformate

Nicht nur HTML lässt sich recht einfach ausgeben, auch sämtliche andere Formate wie .txt, .xml, .js usw. Als Beispiel geben wir alle offenen Punkte in einer Textdatei aus, die zum Beispiel einfach auf ein Mobiltelefon übermittelt werden kann. Natürlich könnte man mit Rails auch ein schickes iPhone-Interface bauen, wenn sich die Anwendung im Internet befindet, aber das dauert dann doch länger. Schauen Sie dazu im Item-Controller in die index-Methode. Dort befindet sich ein „respond_to“-Block. Wenn Sie diesen um eine Zeile ergänzen, sodass der Block wie folgt aussieht, ist das der erste Schritt zu einer Ausgabe als Textdatei:

RUBY
respond_to do |format|
	format.html # index.html.erb
	format.txt #index.txt.erb
	format.xml { render :xml => @items }
end

Listing 8

Nun muss die Rails-Anwendung noch etwas vom Mime-Type „txt“ erfahren. Das erreichen sie über die Datei „config/initializers/mime_types.rb“. Ergänzen Sie dort am Ende die Zeile „Mime::Type.register_alias „text/plain“, :txt“. Wichtig bei Änderungen in diesem Ordner: Der Server muss neu gestartet werden. Wenn Sie das getan haben, brauchen Sie nur noch ein neues Template, das den Text ausgeben soll, hier reicht ein Unter-Template. Legen Sie eine Datei unter „app/views/items“ namens „index.txt.erb“ an und füllen Sie diese mit folgenden Zeilen:

ERb
<% for item in @items -%>
	<%=h item.title %>
<% end -%>

Listing 9

Das war‘s. Wenn Sie jetzt „http://localhost:3000/items.txt“ aufrufen, wird Ihre Textdatei ausgegeben. Rails versetzt Sie in die Lage, die Inhalte und Funktionalitäten Ihrer Anwendung auf einfachste Weise in allen möglichen Formaten wie XML, RSS, Atom, CVS oder iCal auszugeben, lediglich durch die Definition eines Mime-Types, ein passendes Template und einen entsprechenden „respond_to“-Block.

Das Beispiel ist zwar einfach gestrickt, vermittelt aber gut die Fähigkeiten und die Flexibilität von Rails und ließe sich jetzt noch beliebig mit einem Login oder Ajax-Spielereien, oder, oder, oder erweitern.

Problem Hosting

Leider ist Rails nicht ganz so einfach zu deployen wie eine PHP-Anwendung, bei der man einfach alle Dateien auf den Server wirft, eventuell noch die Passwörter anpasst und fertig. Im besten Fall wird auch für PHP-Entwicklungen ein Versionskontrollsystem wie SVN verwendet. Den Einsatz eines solchen empfehlen wir auch für Rails, da es vor allem das Deployen vereinfacht. Eine Anleitung, wie Sie Rails mit SVN oder Git verwenden, finden sie unter [8] bzw. unter [9].

Mehr zu diesem Thema
Fast fertig!

Bitte klicke auf den Link in der Bestätigungsmail, um deine Anmeldung abzuschließen.

Du willst noch weitere Infos zum Newsletter? Jetzt mehr erfahren

Anzeige
Anzeige
Schreib den ersten Kommentar!
Bitte beachte unsere Community-Richtlinien

Wir freuen uns über kontroverse Diskussionen, die gerne auch mal hitzig geführt werden dürfen. Beleidigende, grob anstößige, rassistische und strafrechtlich relevante Äußerungen und Beiträge tolerieren wir nicht. Bitte achte darauf, dass du keine Texte veröffentlichst, für die du keine ausdrückliche Erlaubnis des Urhebers hast. Ebenfalls nicht erlaubt ist der Missbrauch der Webangebote unter t3n.de als Werbeplattform. Die Nennung von Produktnamen, Herstellern, Dienstleistern und Websites ist nur dann zulässig, wenn damit nicht vorrangig der Zweck der Werbung verfolgt wird. Wir behalten uns vor, Beiträge, die diese Regeln verletzen, zu löschen und Accounts zeitweilig oder auf Dauer zu sperren.

Trotz all dieser notwendigen Regeln: Diskutiere kontrovers, sage anderen deine Meinung, trage mit weiterführenden Informationen zum Wissensaustausch bei, aber bleibe dabei fair und respektiere die Meinung anderer. Wir wünschen Dir viel Spaß mit den Webangeboten von t3n und freuen uns auf spannende Beiträge.

Dein t3n-Team

Melde dich mit deinem t3n Account an oder fülle die unteren Felder aus.

Bitte schalte deinen Adblocker für t3n.de aus!
Hallo und herzlich willkommen bei t3n!

Bitte schalte deinen Adblocker für t3n.de aus, um diesen Artikel zu lesen.

Wir sind ein unabhängiger Publisher mit einem Team von mehr als 75 fantastischen Menschen, aber ohne riesigen Konzern im Rücken. Banner und ähnliche Werbemittel sind für unsere Finanzierung sehr wichtig.

Schon jetzt und im Namen der gesamten t3n-Crew: vielen Dank für deine Unterstützung! 🙌

Deine t3n-Crew

Anleitung zur Deaktivierung
Artikel merken

Bitte melde dich an, um diesen Artikel in deiner persönlichen Merkliste auf t3n zu speichern.

Jetzt registrieren und merken

Du hast schon einen t3n-Account? Hier anmelden

oder
Auf Mastodon teilen

Gib die URL deiner Mastodon-Instanz ein, um den Artikel zu teilen.

Anzeige
Anzeige