Web-Frameworks: Ruby on Rails y
Transcrição
Web-Frameworks: Ruby on Rails y
Web-Frameworks: Ruby y on Rails Thomas Jansing Software-Engineering Seminar (WS 2008/2009) 05. Januar 2009 Agenda Web-Frameworks Ruby on Rails Live-Demo Erweiterungen Fazit 1 Agenda Web-Frameworks Ruby on Rails Live-Demo Erweiterungen Fazit 2 Web-Anwendungen Wer hat „Enterprise Application Integration“ gehört? Bedeutung von Web-Anwendungen: Bekannt Problem bei Web-Anwendungen: Heterogenität Programmier-/Skriptsprachen P i /Sk i t h Datenbanken Web Server Web-Server Betriebssysteme/Plattformen Ziel von Web-Frameworks: Erstellen von WebAnwendungen vereinfachen Kombination von Komponenten zu einer Entwicklungsumgebung 3 Web-Frameworks Beispiele für Web-Frameworks NET .NET DotNetNuke, ... JAVA Struts, MyFaces, ... Perl/PHP Catalyst, Symfony, ... Python Django, ... Django Und sonst? 4 Web-Frameworks Ruby on Rails Web-Framework: Rails Programmier-/Skriptsprache: Ruby 5 Allgemeine Konzepte & Paradigmen Rapid Application Development (RAD) R id W b Development D l t & Rapid R id Prototyping P t t i Rapid Web Anforderungen möglichst schnell in ausführbaren Code umsetzen Extreme Programming (XP) Problemlösung steht im Vordergrund Kleine iterative Schritte mit Rückkopplung Test-driven development (TDD) Tests werden vor der eigentlichen Implementierung geschrieben Agile Softwareentwicklung 6 Allgemeine Konzepte & Paradigmen Model-View-Controller (MVC) Architekturmuster Trennung Datenmodel (Model) Präsentationsschicht (View) Steuerungsschicht (Controller) Ziel: Web-Anwendung flexibel gestalten Wiederverwendung Geringerer Pflegeaufwand Geprüfte und stabile Software 7 Agenda Web-Frameworks Ruby on Rails Live-Demo Erweiterungen Fazit 8 Ruby 1995 von Yukihiro Matsumoto entwickelt Obj kt i ti t Programmier-/Skriptsprache P i /Sk i t h Objekt-orientierte Unterstützung für Prozedurale und Funktionale Programmierung Dynamische Typisierung während der Laufzeit (Duck-Typing) „Principle of least surprise“ Syntax orientiert sich stark an natürlicher menschlicher Sprache Klassen Methoden (Java) Modelle, Klassen, Modelle Aktionen (Ruby) 9 Ruby - Beispiel Modell: User Erbt von der ActiveRecord Basis-Klasse class User < ActiveRecord::Base d f self.authenticate(login,password) def lf th ti t (l i d) user = self.find_by_login(login) Aktion if user User-Objekt gefunden? if user.password != password user = nil end end user User-Objekt wird zurückgegeben end end 10 Rails Von David Heinemeier Hansson entwickelt Mitte 2004 2004: Erste öffentliche Version Ende 2005: Version 1.0 Ende 2007: Version 2.0 Open Source Web-Framework (MIT-Lizenz) Praxisnah Basiert auf Code & Erfahrungen bei der Entwicklung einer Projektmanagement Web-Plattform (basecamphq.com) „Konvention über Konfiguration“ Namenskonventionen vermeiden Konfigurationsaufwand DRY P i i („Don´t DRY-Prinzip ( D ´ repeat yourself“) lf“) Vermeidung von Redundanz 11 Rails Meta Programmierung A tomatische Generier ng von on Programmcode Scaffolding Automatische Generierung CRUD-Funktionalität der Modelle Modelle, Views, Controller und Tests Objekt-relationes Mapping (ORM) Konfigurationsaufwand sehr gering DB-Migrationen Versionierung der DB-Schemata möglich 3 Umgebungen Development Test Production 12 Aufbau von Rails 13 Wozu Rails? Rapid Prototyping Ziel u. a. a Entwicklungsdauer/Kosten Ent ickl ngsda er/Kosten red ieren Ziel: reduzieren Wodurch? -> Agilität und Flexibilität Fokus auf Implementierung der Geschäftslogik kürzere Entwicklungs-Zyklen Feedback der Nutzer soll schneller in die Entwicklung einfließen 14 Produktiver Einsatz Wer setzt Ruby on Rails produktiv ein? XING.com Qype.com Eins.de Viele mehr... 15 XING.com 16 Qype.com 17 Eins.de 18 Produktiver Einsatz Gemeinsamkeiten? Web2.0/AJAX Viel dynamischer Inhalt Große „Marktplätze“ 19 Agenda Web-Frameworks Ruby on Rails Live-Demo Erweiterungen Fazit 20 Rails Entwicklungsumgebung OS Windows Windo s Vista 32 bit OS: 32-bit Datenbank: SQLite 3 (Ver. 3.6.4) Ruby (Ver. 1.8.6 27 RC1) 1.8.6-27 Ruby-Gems (Paketverwaltung) Rails 2.1.1 SQLite3 Adapter 1.2.3 Mongrel Web-Server 1.1.5 Konfiguration? Nicht notwendig! 21 Rails Beispielanwendung: Pizza-Bestell-Service Pi a Ver alt ng (Anlegen, (Anlegen Editieren, Editieren Löschen) Admin Pizza-Verwaltung Kunde Bestellung (Anlegen) Unterscheidung Admin, Kunde über Login Funktionalität (Profil) Login-Funktionalität Was erleichtert die Bestellung? Eine Pizza-Suche Grundgedanke: g Rapid p Web Development! p (Anforderungen möglichst schnell in ausführbaren Code umsetzen) Was wird benötigt? Modelle (Klassen) Attribute Assoziationen (Relationen) zwischen Modellen UML Diagramm g 22 UML Diagramm Orders_Pizzas User Pizza +name : string +price : decimal +ingredients : string 23 * * Order +delivery wish : text +delivery_wish * 1 +name : string +address : string p_code : integer g +zip +city : string +login : string +password : string Live-Demo 1. Rails-Projekt erstellen “rails pizza-service” 2. Modell generieren “ruby script\generate scaffold modellname attribut:typ ...” 3. DB migrieren “rake db:migrate” 4 Testen 4. “ruby script\server” http://localhost:3000 p 24 Agenda Web-Frameworks Ruby on Rails Live-Demo Erweiterungen Fazit 25 Session-Handling Session-Hash Variable: session Speichert Objekte über mehrere Requests hinweg Anwendung: User-Objekt, User Objekt, Warenkorb ... Bsp.: session[:user] = User.find_by_id(id) Flash-Hash Variable: flash Speichert Objekte für zwei aufeinander folgende Requests Anwendung: Fehlermeldungen, Bestätigungen ... Bsp.: flash[:error] = „Password is incorrect!“ Im View: <%= flash[:error] %> 26 Validierung Validationen werden im Modell definiert B Pi M d ll (app\models\pizza.rb) ( \ d l \ i b) Bsp.: Pizza-Modell # All Alle d drei Attribute angegeben werden i Att ib t müssen ü b d validates_presence_of :name, :price, :ingredients # Das Attribut “Name” Name der Pizza soll eindeutig sein validates_uniqueness_of :name # Das Attribut “Preis” soll positiv sein validates_numericality_of :price, :on => :create, :greater_than => 0, :message => "Price should be > 0." 27 Live Demo Web-Services und AJAX sind fester Bestandteil von Rails Live-Demo 28 Sicherheit in Rails „SQL-Injection“ Person.find(:first, :conditions => “user = #{p [ ]} ” + “and p ‘#{params[:user]}’ pw = ‘#{params[:password]}’”) Keine Überprüfung! Person.find(:first, :condition => [“user=? and pw=?”, p , user, , p pw]) ]) Person.find_by_name_and_pw(:user], params[:password]) Implizite Überprüfung! 29 Sicherheit in Rails „cross-site scripting“ (XSS) <%= @einWert %> Keine Überprüfung! html_escape() Methode von Ruby für alle Variablen verwenden, die erst bei der Generierung der Views ausgewertet werden <%=h @einWert %> Kein Einschleusen von HTML-Code und/oder Skripten möglich 30 Performance Langsamer als Ja a EE orhanden (noch) Java EE, da keine VM vorhanden Vergleichbar mit Django (basiert auf Python) Besser als Symfony (basiert auf PHP) Caching/Load-Balancing g g etc. vorhanden Umfangreiche g Tools zur Performance-Optimierung p g vorhanden 31 Agenda Web-Frameworks Ruby on Rails Live-Demo Erweiterungen Fazit 32 Fazit Heterogenität bei Web-Anwendungen R b on Rails R il als l Web-Framework W bF k Ruby RAD, XP, TDD, MVC als allgemeine Konzepte „Konvention Konfiguration / DRY-Prinzip Konvention über Konfiguration“ DRY Prinzip als spezielle Konzepte Meta-Programmierung / ORM Prototyp mit CRUD-Funktionalität Online-Markplätze/Stadt-Portale als Beispiele für produktiven Einsatz Mö li h Verbesserungen Mögliche V b I18n (Thema der aktuellen Rails Versionen) Ruby in einer VM? Performance 33 Fazit Vielen Dank für Ihre Aufmerksamkeit ! Fragen? 34 Rails Verzeichnisstruktur Verzeichnis Inhalt app pp Alle wichtigen g Bestandteile des MVC-Musters: Hilfs-, Kontroller- und ModellKlassen, sowie sämtliche Views (*.html.erb) config Konfigurationsdateien (z. B. database.yml) db DB-Migrationsskripte, SQLite3 Datenbank-Datei (nach Anlegen) doc Dokumente, die mit rdocs erstellt wurden lib Zusätzliche Ruby-Bibliotheken/Erweiterungen log Logfiles des WEBrick/Mongrel-Servers public Öffentliches Wurzel-Verzeichnis des Web-Servers mit statischen Dateien (z. B. Bilder, JavaScript, CSS, ...) script Start-Skripte (z (z. B. B Server-Start Server-Start, DB-Konsole DB-Konsole, Generatoren) test Test-Skripte, Unit-Tests, Funktionale Tests sowie Integrationstests tmp Temporäre Dateien (z. B. Session Session-Dateien, Dateien, Cache Cache-Dateien) Dateien) vendor Plug-Ins und andere Erweiterungen 35 Rails Tags Tag Beschreibung <% % RUBY_CODE % %> Code wird ausgewertet, g keine Ausgabe g <%- RUBY_CODE -%> Code wird ausgewertet, keine Ausgabe, unterdrückt <br> <%= RUBY_CODE _ %> Code wird ausgewertet und als String ausgegeben <%=h RUBY_CODE %> Code wird ausgewertet, Resultat wird durch html_escape gefiltert <%# RUBY_CODE %> 36 Code wird nicht ausgewertet (Kommentar) Web-Services in Rails Version 1.0 Ser ices SOAP Web Web-Services Modul: Action Web Service Ab Version 2.0 Übergang auf Representational State Transfer (REST) RESTful Web-Services Modul: Active Resource Services vs. Resources Modelle in Rails sind automatisch Ressourcen! Manipulation durch HTTP-Requests POST, GET, PUT, DELETE 37 Templates Templates befinden sich unter app\views\ D i Template-Engines T l t E i Drei Embedded Ruby (ERb) [*.html.erb] HTML Templates mit über Tags eingebettetem Ruby-Code Ruby Code HTML-Templates <%=h RUBY_CODE %> XML [*.xml.erb] XML-Templates für Web-Services Ruby JavaScript (RJS) [*.js.rjs] Übersetzt Ruby Code zur Laufzeit in JavaScript Controller steuert Views (vgl. MVC-Muster) Render :action => „ „Template p _name“ Anstatt :action auch :template oder :file möglich 38 Layouts Layouts unter app\views\layouts\ Kon ention statt Konfiguration“ Konfig ration“ Wieder „Konvention Für gesamte Anwendung: application.html.erb Für einzelne Controller: controller.html.erb CSS Einbindung: <%= stylesheet_link_tag 'pizza' %> Statischer Inhalt befindet sich unter public\ public\stylesheets \ pizza.css public\images public\javascripts script.aculo.us (AJAX-Framework) Prototype (AJAX-Framework) 39