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