W eb development that doesn`t hurt

Werbung
13.02.-15.02.2008 Campus Gummersbach
“Web development that doesn’t hurt”
ASS Training
Ruby on Rails
Andreas Bade
Dirk Breuer
self.inspect
?
self.inspect
• Wichtige theoretische Grundlagen
• Lernen durch Eigenleistung
Ruby on Rails und Webentwicklung
• Sehr praxisbezogener Einstieg in Ruby,
self.inspect
umgehen (Sessions/Cookies)
• Mit der Stateless-Problematik von HTTP
Entwicklung
• Konzepte und Praxis testgetriebener
Applikationen
• Erstellen von Ruby Code
• Selbstständiges Erstellen von Rails
def training; end
gegenüber anderen Technologien?
• Beantwortung der Fragen:
• Was ist Ruby?
• Was ist Rails?
• Was sind sie Vorteile / Nachteile
def training; end
• Im Wechsel Vortrag/Demos und Hands-On
• Mittagspause
• kleinere Pausen zwischendurch
Organisation
Text Editor
TextMate
Datenbank
SQLite3
Kommandozeile
iTerm
Browser
Firefox
Tools
export http_proxy=wwwproxygm.fh-koeln.de:8080
export PATH=/usr/local/bin:$PATH
Setup
•
•
•
•
•
•
•
Tag 1
Tag 2
Tag 3
User Login
Test-First Development
View und Controller (ActionPack)
ActiveRecord::Associations
Das M in MVC (ActiveRecord)
Beginn der Applikation (Rails)
Warm-Up & Grundlagen (Ruby)
3.days do
Get on the Track
Day One
• Dynamische OO-Programmiersprache
• Interpretersprache
• Fokus auf Simplicity und Productivity
• Ruby is fun!
Ruby.new
Keine “primitiven”
Datentypen
dynamische Typisierung
Alles sind Objekte!
{‘name’ => ‘Programming Ruby’,
‘author’ => ‘Dave Thomas’}.class
[‘Andi’, ‘Dirk’].class # Array
“Hello World”.class # String
42.class # Fixnum
Objektorientieung
• initialize Methode
Keywords
• class und module
training = Training.
def my_method
# ... do somethin
end
end
class Training
def initialize
# Constructor
end
Objekte definieren
• Klassenvariablen (@@class_var)
• Instanzvariablen (@instance_var)
• lokale Variablen (locale_var)
• Konstanten (CONSTANT)
Variablen
• Andere Repräsentation einer Zeichenkette
• Spart Speicherplatz
• Schreibweise: :andi
abgelegt und bei Gebrauch instanziiert
• Symbole werden einmal in Speicher
Symbole
•
Bei der Symbol Klasse
die selbe Zeichenkette
nur einmal.
wird die selbe
Zeichenkette zweimal im
Speicher abgelegt.
• Bei der String Klasse
"ruby".object_id
3256020
"ruby".object_id
3253400
:ruby.object_id
166018
:ruby.object_id
166018
>>
=>
>>
=>
>>
=>
>>
=>
Symbole
dennoch weitere
Eigenschaften zu
inkludieren
• Einfach Vererbung
• Aber: Mixins erlauben
class Training
include Launch
end
class Training << ASS
end
Vererbung
• while
• until
• for
for i in 0...10 do
puts i
end
until k < 42
# do something
end
file = File.open(‘test.txt
while line = file.gets
# do something
end
Schleifen
name == “Bob” ? puts “Hello Bob” : puts “Who a
case name
when “Bob”
puts “Hello Bob”
else
puts “Who are you”
end
Ternäre Ausdrücke
case Anweisung
if und unless
Ausdrücke
if name == “Bob”
puts “Hello Bob”
else
puts “Who are you”
end
Bedingungen
•
•
•
An den Code im Block können
auch Objekte übergeben
werden und lokale Variablen
innerhalb des Blocks gelten nicht
außerhalb.
Der Code im Block ist wie eine
Methode nur ohne an ein Objekt
gebunden zu sein.
Ein Proc-Objekt verpackt einen
Block Code und kann diesen zu
einem späteren Zeitpunkt
immer wieder ausführen.
Ho!
Ho!
Ho!
my_proc.call
my_proc.call
my_proc.call
my_proc = Proc.new
puts ‘Ho’
end
Procs und Blöcke
# => Today we got 42 degree!
# => Today we got 23 degree!
todays_weather.call 42
todays_weather.call 23
todays_weather = Proc.new do |temprature|
puts "Today we got #{teprature} degree!"
end
An Proc-Objekte können auch auch Objekte
übergeben werden.
Procs und Blöcke
[1,3,5,6,7].find Proc.new { |e| e.modulo(2) == 0 } # -> 6
class Array
def find(find_proc)
for i in 0...size
return self[i] if find_proc.call(self[i])
end
return nil
end
end
Iteratoren werden in Ruby mit Proc-Objekten
realisiert. Für jedes Element in einer Datenstruktur
kann eine beliebige Funktion ausgeführt werden.
Procs und Blöcke
ay = [“Hallo”]
ay << “Welt” # [“Hallo”, ”Welt”]
ing = “Hallo”
ing << “Welt” # “HalloWelt”
“If it walks like a duck and talks like a
duck, it maybe is a duck.”
Duck Typing
Experimentieren mit Code
• Interactive Ruby Shell (irb) für schnelles
starten
• Ruby Source Files enden auf .rb
• Ruby Programme mit ruby Dateiname
Syntactic Sugar
Demo
Hands-On!
Mittagspause
• MVC-Framework für Webapplikationen
• “Convention over Configuration”
• DRY (“Don’t Repeat Yourself!”)
• DSL für Webapplikationen
• Open-Source (MIT-Lizenz)
Ruby on Rails
•
•
•
•
•
•
•
•
Werkzeuge zur Automatisierung (rake)
Code Generierung (script/generate)
Test::Unit Integration
Webservice Integration (RESTful + ActiveResource)
Javascript Support (ActiveSupport)
(X)HTML-Rendering (ERb + ActionView)
HTTP-Request/Response Unit (ActionController)
ORM-Layer (ActiveRecord)
Architektur
Action
Mailer
Build Tool
Tests
e Generatoren
In Funktionalität
Bestandteil von Rails:
liefert aus
Active
Support
unterstützt
Action
View
zeigt an
Bowser oder
Client
rendert
Apache, WEBrick,
Lighttpd, mongrel
antwortet
CRUDs
Datenban
Abfragen
Active
Record
Validierung und
Business Prozesse
ruft FastCGI, SCGI,
CGI oder mod_ruby
Prozess auf
MySQL, PostgreSQL,
Oracle, ...
leitet um
Action
Controller
lädt
Dispatcher
leitet weiter
Web Server
Action Pack
(X)HTML, JS,
XML, ...
HTTP
Request
HTTP, RSS, ATOM, SOAP,
XML-RPC, etc.
Action
View
View
Benutzereingaben
Notifikation bei
Änderung
Zustandsabfrage
Auswahl
Anzeigen
Controller
Action
Controller
Active
Record
Model
Änderung des
Zustands
Rails & MVC
sondern in der HTTP Schnittstelle (HTTPVerbs)
• Keine Methodeninformation im URI,
über URI adressiert
• Representational State Transfer (REST)
• Repräsentationen von Ressourcen werden
REST
Action
Create
Read
Update
Delete
HTTP Verbs
POST
GET
PUT
DELETE
• CRUD wird auf HTTP Verbs abgebildet
RESTful
Demo
Speicher
• Kapseln den Zugriff auf die Daten
• Entsprechen meist “realen” Entitäten
• Webapplikationen: Meist Datenbanken als
Applikation
• Modelle halten die Business Logik der
M in MVC
n object that wraps a row in a database table or view, encapsulates
Datenzugriffs- und Domänenlogik vereinen si
einem Objekt
Daten sind meist persistent (Datenbank)
Objekte beinhaltet Daten und Verhalten
Martin Fowler (Chief Scientist ThoughtWorks.c
ActiveRecord?
(wird nicht behandelt)
• Abbilden von Relationen
• Validierung von Werten
• Abbilden der Objekte auf Datenbank (ORM)
• “Single Table Inheritance”
Fähigkeiten von AR
Methode bereit gestellt
• Spaltennamen werden zur Laufzeit als
Objekts aus der DDL der entsprechenden
Tabelle
• Dynamische Extraktion der Attribute eines
Fähigkeiten von AR
ActiveRecord::Migration
• Abstraktion der Schemadefinition durch
! Transparent für die Applikation
• (Fast) jedes relationale Datenbanksystem
• Abstraktion der Datenbankabfragen
Rails und DBMS
(rake db:migrate)
• Migration durchführen
(self.up, self.down)
• Zwei Methoden
(db/migrate/001_create_people.rb)
• Migrationsdatei
(script/generate migration)
• Erstellung der Migration
def self.down
drop_table :people
end
execute „ALTER TABLE ...“
end
t.timestamps
end
def self.up
create_table :people do |t|
t.string :firstname, :lastname
t.date :birthdate
class CreatePeople < ActiveRecord::Mi
ActiveRecord::Migration
ss Person
People < ActiveRecord::Base
ATE TABLE `people` (
`
int(11) NOT NULL auto_increment,
rstname` varchar(255) default NULL,
stname` varchar(255) default NULL,
irthdate` datetime default NULL,
IMARY KEY (`id`)
GINE=InnoDB DEFAULT CHARSET=latin1
self.down
self.down
drop_table
:people
rop_table :people
self.up
self.up
reate_table :people do |t|
create_table
:people do |t|
t.string :firstname, :lastname
t.column :firstname, :string
t.date :birthdate
t.column :lastname, :string
t.column :birthdate, :date
t.timestamps
end
nd
s CreateArticle
ss
CreatePeople <
< ActiveRecord::Migration
ActiveRecord::Migration
•
•
•
Die Klasse die Tabelle
Eine Instanz eine Zeile
Die Attribute die jeweiligen Spalte
•
•
•
Über die Klasse Customer lässt dich
die Eigenschaften zugreifen. Dabei
repräsentiert:
rake db:migrate wandelt diese in
spezifischen SQL Code um
Migration definiert in Ruby die DDL
ActiveRecord::Base
Demo
• Live Suche in den Einträgen
Kommentarfunktion und Loginbereich
• Einfaches Blogsystem mit
Workshops
• Beispielaufgabe für die Dauer des
MyBlog
Kommentare
User
Artikel
• Was ist Kernstück eines (unseres) Blogs?
MyBlog
Text
Titel
Autor
ok
blog
eintrag
blog
eintrag
blog
eintrag
StartSeite
kommentieren
zurück
Neues Kommentar anlegen
ommentieren
inzufügen (nach
ikel anzeigen
uchen
nzeigen
Navi
zurück
...
neuen eintrag
ansehen
Text
Titel
ok
Neuen Artikel anlegen
einen Antrag
ansehen
Login
blog
eintrag
Kommentar
Bild
DetailSeite Artikel
Flowchart
4. Anlegen der nötigen Views
3. Anlegen der nötigen Controller
2. Anlegen der nötigen Modelle
1. Rails Projekt anlegen (rails myblog)
Vorgehensweise
• Entweder “Alles auf einmal”
• oder “Iteratives Vorgehen”
• Rails begünstigt iteratives Vorgehen!
• Warum?
Vorgehensweise
• Dadurch:
• Gefahr der Wiederholung
• Nicht Berücksichtigung der Änderungen
während der Entwicklung
• Oft Änderungen der Anforderungen
Iteratives Vorgehen!?
• Rails unterstützt dabei durch
• MVC-Integration
• DSL
• Test-Integration (später)
OO-Programmierung
• Ausnutzung der Möglichkeiten der
Lösung
- Controller und View dafür
erzeugen mit Scaffold Generato
• Anfangen mit “Artikel”
• Scaffolding um Artikel einzutragen
• weitere Funktionen anschließend
MyBlog
- Modell “Article” erzeugen
Hands-On!
(errors Hash wird gefüllt)
• Gescheiterte Validierung = Fehlermeldung
Methode
• Validierung vor Speicherung des Objekts
• Jedes (Model-)Objekt hat eine ‘validate‘
festgelegt
• Validierung von Werten werden im Model
Validierung
:within => 5..2
• validates_presence_of :name
• validates_uniqueness_of :key
• validates_format_of :email
• validates_length_of :password,
Validierung
Mehr Informationen z
Validatoren im Handout
•
•
beinhaltet immer alle
Fehler die beim Versuch der
Speicherung aufgetreten sind.
errors
Bei eigener validate Logik
muss das errors Hash gefüllt
werden, da es die Schnittstelle
darstellt um mit den anderen
Funktionen von AktiveRecord
weiterhin arbeiten zu können
(Bsp.: valid?,
error_messages_for).
end
def validate
errors.add(„attribute_name“, „mess
unless „attribute_name" ==
„other_attribute“
end
validate_presence_of :firstname
class Customer < ActiveRecord::Base
Validierung
Mehr Informationen z
Validatoren im Handout
• Validieren der Benutzereingaben
• Sinnvolle Auswahl der Attribute
• Ausgabe bei Fehlermeldungen
Back to MyBlog
Hands-On!
• Rails als agiles MVC-Framework
• Meinungen bisher?
Programmiersprache
• Ruby als dynamische OO-
Tag 1 - Fazit
09:00 Uhr
Thursday, 16 Feb. 2008,
See You Tomorrow
Feel the Speed
Day Two
•
•
•
•
•
•
•
Tag 1
Tag 2
Tag 3
User Login
Test-First Development
View und Controller (ActionPack)
ActiveRecord::Associations
Das M in MVC (ActiveRecord)
Beginn der Applikation
Warm-Up & Grundlagen
3.days do
Fragen bis hierher?
"Weiteres Model/Tabelle in der Datenbank!
"Problem: Abbilden der Relation in Rails
werden können
• Bisher: Artikel anlegen und editieren
• Was fehlt: Artikel sollen kommentiert
MyBlog
• Stärkere Individualisierung der Applikation
• Daher: Auseinandersetzen mit ActiveRecor
Codes (Scaffolding)
• Bisher nur Verwendung des generierten
Working with AR
Demo
können
• Relationen auf Objektebene modellieren
• Die Relation muss persistiert werden
Entitäten
• Arbeit mit mehreren Entitäten
• Abbilden von Relationen zwischen
ActiveRecord::Associations
• has_one
• belongs_to
• has_many / has_many :through
• has_and_belongs_to_many
Beziehungstypen
id
title
filename
pictures
has_one
1
1
id
picture_id
filename
thumbnails
belongs_to
ss Thumbnail < ActiveRecord::Base
elongs_to :picture
Beziehung in der
Datenbank auf
• Löst die Foreign Key
Methode ‘thumbnail’
• Erweitert ‘Picture’ um
auf Objektebene ab
• Bildet eine 1:1 Bezieh
has_one
ss Picture
Pi t
< ActiveRecord::Base
as_one :thumbnail
n Keys sind
onvention der
nname im
ar plus ‘_id’
n sind nach
ntion im Plural
id
firstname
lastname
…
people
has_many
1
n
id
person_id
street
zip
…
addresses
belongs_to
ss Address < ActiveRecord::Base
elongs_to :person
ss Person < ActiveRecord::Base
as_many :addresses
Methode ‘person’
• Erweitert ‘Address’ um
den Foreign Key in ein
oder 1:1 Beziehung hä
• Beschreibt die Tabelle,
belongs_to
id
firstname
lastname
…
people
has_many
1
n
id
person_id
street
zip
…
addresses
belongs_to
ss Address < ActiveRecord::Base
elongs_to :person
ss Person < ActiveRecord::Base
as_many :addresses
addresses.person_id’
WHERE people.id =
aller Adressen zurück
‘SELECT * FROM addres
• ‘addresses’ gibt ein Ar
Methode ‘addresses’
• Erweitert ‘Person’ um
auf Objektebene ab
• Bildet eine 1:n Bezieh
has_many
me
adline
projects
n
1
n
1
id
name
skills
…
developers
has_many_and_belongs_to_many
developers_projects
project_id
any_and_belongs_to_many
ss Developer < ActiveRecord::Base
as_and_belongs_to_many :projects
auf Objektebene ab
Datenbank notwendig,
KEINE ActiveRecord::
Klasse
• Zwischentabelle nur! i
• has_and_belongs_to_
• Bildet eine n:m Bezieh
habtm
ss Project < ActiveRecord::Base
as_and_belongs_to_many :developers
isch geordnet
men der
pften Tabellen
line
projects
any :through
n
1
assignments
project_id
developer_id
belongs_to
n
1
id
name
skills
…
developers
has_many :through
s Developer < ActiveRecord::Base
s_many :projects, :through => :assignments
s Assignment < ActiveRecord::Base
longs_to :developer
longs_to :project
s Project < ActiveRecord::Base
s_many :developers, :through => :assignments
Attribute und bietet di
Möglichkeit Validierun
durchzuführen
• Zwischentabelle enthä
ActiveRecord::Base Kl
‘assignments’ abgebild
• Zwischentabelle wird
auf Objektebene ab
• Bildet eine n:m Bezieh
has_many :through
Demo
(Ein Kommentar darf niemals alleine stehen)
• Validierung beachten!
(mit Migration)
• Datenbanktabellen ggf. überarbeiten
ActiveRecord::Associations
• Modelle haben noch keine Relationen
• Relationen erstellen mit Hilfe von
Back to MyBlog
Hands-On!
Kommentarfunkti
implenentieren!
URL: ar.rubyonrails
Assoziationen
Mittagspause
Action
View
View
Benutzereingaben
Notifikation bei
Änderung
Zustandsabfrage
Auswahl
Anzeigen
Controller
Action
Controller
Active
Record
Model
Änderung des
Zustands
Einbinden der
Assoziationen
--
Controller und V
erklären
Views und Controller
View-Elemente in Ordner app/views
Layouts für ständigen Inhalt (Bsp: Header, Footer, etc)
•
•
•
•
Repräsentation der Daten aus DB
•
app/views/controllen_name/action_name.rhtml
Jede Action hat eigenes View-Template
app/views/controller_name
Jeder Controller hat eigenen View-Template Ordner in
app/views/layouts
View generiert das User-Interface
•
View
<%= Ruby expression -- replace with result %>
<%- Ruby code -- inline with output %>
• Einbettung durch Inline-Element <% %>
Dokumente (XHTML, XML…)
• ERB - Embedded Ruby
• Templatesprache für Plain-Text
View im Detail
ble>
tbody>
% @articles.each do |article| %>
<tr>
<% Articles.column_names.each do |column| %>
<td><%= article.send(column) %></td>
<% end %>
</tr>
% end %>
<table>
/tbody>
<tbody>
<
able>
...
ERB P
arser
<tr>
<td>ASS Training ist toll</t
<td>Dirk Breuer</td>
...
</tr>
...
</tbody>
Ausgabe in der View
HTML-Fragmente
• Lösung: Wrapper-Methoden für komplexe
Präsentationsschicht
• Entlastung der View von Ruby-Code
• Problem: Ruby-Code in der
ActionView::Helper
orm action=“/articles/create“ method=“post“>
<input type=“text“ size=“30“ name=“article[title]“ id=“article_title“ />
<input type=“submit“ name=“Create“ value=“commit“ />
href=“/articles/list“>Übersicht</a>
ht</a>
ERB P
arser
<%= start_form_tag :action => 'create' %>
<%= text_field “article“, “title“ %>
<%= submit_tag "Create" %>
<%= end_form_tag %>
<%= link_to “Übersicht“, :controller => ‘articles‘, :action => ‘list‘ %>
ActionView::Helper
‘Moderator‘ der Applikation (app/controllers)
HTTP-Request/Response Handler
Jeder Controller besitzt ein Request/Response-Objekt
•
•
! Teilen von übergreifenden Funktionen
Alle Controller erben vom ApplicationController
(application.rb)
•
•
Controller
Actions sind öffentliche Methoden des Controllers
Actions können rendern oder an andere Actions weiterle
Verfügbarkeit der Actions durch Routing
•
•
Eigentliche Operationen werden von den Actions
durchgeführt
•
•
Controller
params[:key], session[:key]
(redirect_to :action => ‘index‘)
(render :template => ‘show‘)
• Render
• Redirect
• Zugriff auf Request Parameter und Session
View-Template auf
• Action ruft automatisch gleichnamiges
Controller im Detail
• http://localhost:3000/articles/1/edit
• rake routes
• articles -> controller (params[:controller])
• 1 -> params[:id]
• edit -> action (params[:action])
URI und Parameter
• Überarbeiten von Controller und Views
• Create Read Update Delete - Methoden
• Eingaben und Ausgaben berücksichtigen
• Artikel sollen kommentiert werden können
Back to MyBlog
Hands-On!
(_form.rhtml)
• Partials sind Teilstücke der View
• Seperate Dateien
• Wiederverwendbarkeit von Code
• Modularisierung der View
Partials
!
!
Rendert Partial ‘person‘ mit lokaler Variable
•
Rendert Partial ‘comment‘ mit gleichnamiger lokaler Variable
‘comment‘ für alle Objekte in der Collection
render :partial=>‘comment‘,
:collection => @articles.comments
•
render :partial=>‘person‘,
:locals => {:name => “andi“}
• Verschiedene Möglichkeiten
Partial Aufruf
• Sinnvolle Partial-Elemente erzeugen
• DRY erleben!
implementieren
• Liste der Kommentare als Partial
Back to MyBlog
Hands-On!
• Integration des MVC-Konzepts in Rails
• Model (ActiveRecord)
• View (ActionView)
• Controller (ActionController)
• Meinungen bisher?
Tag 2 - Fazit
• Treffpunkt: Chaos Computer Club Cologne
• http://rurug.de
19:30 - 21:30 Uhr
• Jeden zweiten Donnerstag im Monat von
RuRUG Köln
09:00 Uhr
Friday, 15 Feb. 2008,
See You Tomorrow
Final round
Day Three
•
•
•
•
•
•
•
Tag 1
Tag 2
Tag 3
User Login
Test-First Development
View und Controller (ActionPack)
ActiveRecord::Associations
Das M in MVC (ActiveRecord)
Beginn der Applikation
Warm-Up & Grundlagen
3.days do
Fragen bis hierher?
• Was fehlt: Testing
• Was fehlt: Login
"Rails Test Environment kennen lernen
"Login Implementieren (test-driven)
Kommentare hinzufügen
• Bisher: Artikel anlegen und editieren,
MyBlog
existiert nicht!
• Nur automatisierte Tests gelten als Test
• Bei TDD: Code der nicht getestet wird,
immer im Browser.“
• „Aber ich teste doch! Ich mach das dann
Testen?!
Applikation zu verstehen
• Die Tests sind Spezifikation der
durchläuft
• Funktionalität implementieren bis Test
Implementierung
• Test Case formulieren vor der eigentlichen
TDD
• 3 verschiedene Arten von Tests
• Unit (Testen der Modelle)
• Functional (Testen der Controller)
• Integration (Übergreifende Testfälle)
Ordner test aus
• Führt alle vorhandenen Test-Fälle im
rake test
• Bei Rails: Testen der ActiveRecord Klassen
• Testen von Funktionen wie
• Validatoren (vor allem Selbstgeschriebene)
• eigene Methoden
• Abhängigkeiten
Software
• Allgemein: Testen einzelner Module in einer
Unit Tests
TestCase bereitgestellt
• Fixturedaten werden über users(:dirk) im
Datenbank gespielt
• Testdaten
• Werden für jeden Testfall neu in die
Fixtures
• Eine Datei pro Tabelle
Modellklassen lassen sich
ebenfalls abbilden
• Assoziationen zwischen
YAML (Serialisierung).
Hierarchien werden durch
Einrückungen abgebildet
(je zwei Leerzeichen
KEINE Tabs)
• Definition von Objekten in
# users.yml
dirk:
email: [email protected]
firstname: Dirk
lastname: Breuer
password: 5eb942810a75ebc850972a89285d570d4
created_at: <%= Time.parse("2006-04-12
16:00:12").to_s(:db) %>
# articles.yml
first:
title: Mein Artikel
content: Wichtiger Inhalt zum Artikel
author: dirk
Fixtures
ssertions (Aussagen
estätigen)
est Methoden (beginnen immer
it test)
etup Methode (wird vor jeder
estmethode ausgeführt)
ixtures (Testdaten)
rbt von Test::Unit::TestCase
article.title = "Valid Title"
article.author = users(:bob)
assert_valid article
assert article.save
end
article.title = "<script>javascript:alert('Hallo');</
assert !article.valid?
def test_has_valid_title
article = Article.new(:title => '')
assert !article.valid?
def setup
# Do some initial stuff
end
class ArticleTest < Test::Unit::TestCase
fixtures :articles
require File.dirname(__FILE__) + '/../test_helper'
Aufbau Test Case
Demo
• rake test:units
haben?
• Kann ein Artikel mehrere Kommentare
Artikel?
• Gehört ein Kommentar immer zu einem
Back to MyBlog
Hands-On!
•
•
•
•
•
•
•
Ist der Zugang tatsächlich beschränkt?
Stimmt die Sortierung?
Wird das richtige Suchergebnis geliefert?
Werden die richtigen Variablen gesetzt?
Testen von Funktionen wie
Testen einzelner Controller
Testen der Funktionen die einem User (oder anderem System)
angeboten werden
Functional Tests
Demo
Hands-On!
und anschließend das anlegen von
Kommentaren in Reihe?
• Testen von Workflows innerhalb der Applikation
• Testen mehrerer Controller im Zusammenspiel
• Testen von Funktionen wie:
• Klappt der Request von A nach B?
• Funktioniert der Login, anlegen eines Artikels
Intergration Tests
Mittagspause
zulassen
• Loginbereich
• Bestimmte Aktionen nur nach Login
bestehende editieren können
• Nicht jeder soll neue Artikel anlegen oder
User Login
• Anwendung des bisher Gelernten
• HTTP-Stateless-Problematik
User Login
hinterlegt
• Session-Key wird i.d.R. im Cookie
Server hinterlegt
• Session ist (temporär) persistent auf dem
von Session
• Problem: HTTP ist Stateless Protokoll
• Lösung: Pseudostate einführen in Form
Sessions
ession Key/Value Paar in
ie (der Domain) schreiben
User
Sessions
11. Request
4. Response
(mit Session Key/Value Paar)
3. Session
erzeugen!
Nein
2. Session
vorhanden??
Server
ession Key/Value Paar aus
us
Cookie (der Domain) laden
User
2. Request
(mit Session Value)
Sessions
5. Response
4. Session
laden
Ja
3. Session
vorhanden??
Server
Demo
•
•
•
•
•
•
Cookie (HÄ??)
Memcached
Speicher
Datenbank
Filesystem
In Rails ist die Session als Hash realisiert, das
serialisiert auf einem persistenten Speicher hinterlegt
wird, z.B.:
Sessions
•
•
•
Prinzipiell kann alles in der Session gespeichert
werden, aber abwägen was tatsächlich gespeichert
werden soll
session
Zugriff auf das Session Hash über die Methode
Hier verwenden wir nicht die Standardlösung (CookieBased), sondern Filesystem
Sessions
nicht behandelt)
• Hier: before_filter
(andere werden
Controllern gemeinsam benutzt werden
• Filter können von verschiedenen
die Applikation ein (Bsp: Authentisierung)
• Filter fügen Querschnittfunktionalität in
Filter Chain
ticlesController < ApplicationController
_filter :authenticated,
:only => [‘new‘, ‘create‘,
‘update‘, ‘edit‘]
class ApplicationController < ActionController::Base
def authenticated
if session[:user]
true
else
redirect_to :controller => ‘users‘, :action => ‘
end
end
end
typischerweise im ApplicationController
• Definition der Filter im Controller
• Definition der Methode die beim Filter ausgeführt,
Filter Chain
• Sicherstellung durch Testen
Berechtigung darf geschützte Funktionen
ausführen.
• Wichtige Funktion! Niemand ohne
Integration des Logins
Hash-Funktion
Salt
5eb942810a75ebc850972a8
Password
Exkurs: Hash-Funktion
• User mit Login erstellen
• Test-Case für Login im Blog erstellen
• Fixtures erstellen
• Testfall schreiben
• Test laufen lassen
Back to MyBlog
Hands-On!
• Kein Reload der Seite bei Aktualisierung
• Look&Feel von Desktop-Applikationen
Browser und Server
• Akronym für Asynchronous JavaScript and XML
• Der Begriff ist neu und voll im Trend!
• Das Konzept ist alt! (XmlHttpRequest)
• Asynchrone Datenübertragung zwischen
AJAX
Javascript-Aufruf
AJAX-Engine
Manipulation
des DOM
Browser
HTTP-Request
(XML-Daten)
XML-Daten
AJAX-Modell
Webserver
(Script.aculo.us, Prototype…)
• Kein Plugin erforderlich
• Völlig neue Interaktionsmöglichkeiten
• Live-Suche, Auto-Completion, etc.
• Viele kostenlose API‘s und Frameworks
Vorteile
• Polling-Problematik
• Zurück-Button
• Lesezeichen
• Feedback
Nachteile
•
,
link_to_remote form_remote_for observe_field
,
…
einfachen Zugriff auf AJAX-Funktionen
• Wrapper-Methoden ermöglichen
und Script.aculo.us
• Vollständige Integration von Prototype
AJAX in Rails
des Suchworts angezeigt
• Live-Suche
• Suchergebnisse werden bei der Eingabe
AJAX in Action
werden
• Veränderung mehrerer DOM-Elemente
• Nutzt XmlHttpRequest
• Bestimmt WIE Templates modifiziert
Javascript Generator
Templates (rjs)
nder :update do |page|
page.insert_html :before, ‘element-id‘, :partial => ‘cron
page.replace_html ‘element-id‘, :partial => ‘search‘,
:locals => { :articles => @articles }
page.remove ‘element-id‘
page.show ‘element-id‘
page.hide ‘element-id‘
d
render :update
• „Ajaxified“ Blog mit Live-Suche
• Suche für Artikel
• Welche Suchkriterien sind relevant?
Back to MyBlog
Hands-On!
End of Days
• Hauptanforderungen erfüllt!
• Nach der Pflicht kommt die Kür
• RSS-Feed für den Blog
• Bilder-Upload für Artikel
• Live-Suche mit AJAX
• ...
Projektabschluss
• Knowledge-Pack für alle!
• Rails unterstützt das MVC-Model
• Entlastung des Entwicklers bei Konfiguration
• Konzentration auf die wesentlichen Dinge
Applikationen
• Einstieg in das Rails Framework
• Agile Methode zur Entwicklung von Web-
Zusammenfassung
•
•
•
•
Kompletter Source Code
Hand-Outs
Folien
http://www.medieninformatik.fh-koeln.de
Knowledge-Pack
•
The Pragmatic Programmer - Dave Thomas, Andrew Hunt (Addison-Wesle
ISBN: 0-201-61622-X)
Programming Ruby - Dave Thomas, Andrew Hunt (The Pragmatic Program
ISBN: 0-974-51405-5)
Ruby for Rails - Dave A. Black (Manning, ISBN: 1-932394-69-9
Agile Web Development with Rails (2nd Ed.) - Dave Thomas, David Heinerm
Hansson (The Pragmatic Programmers, ISBN: 0-9776166-3-0)
Rails Recipes - Chad Fowler (The Pragmatic Programmers, ISBN:
0-9776166-0-6)
•
•
•
•
•
Literatur
Knowledge-Pack
http://errtheblog.com
http://weblog.jamisbuck.org
http://drnicwilliams.com
http://railscasts.com/
http://nubyonrails.com
http://peepcode.com/
http://therailsway.com/
http://code.google.com/p/blueprintcss/
http://csszengarden.com/
http://studios.thoughtworks.com
•
•
•
•
•
•
•
•
•
•
http://www.ruby-lang.org
http://rubyonrails.com
http://script.aculo.us
http://www.prototypejs.org
http://de.selfhtml.org/
http://groups.google.com/group/rubyonrails-talk
http://subversion.tigris.org/
http://git.or.cz
http://rubyquiz.com/
http://rubyforge.org
Web Links
Trac / Mingle / Basecamp
Subversion / Git
MySQL / SQLite3
RubyGems
Commandline
Mac OS X + TextMate
Firefox + Firebug
•
•
•
•
•
•
•
Aptana
3rdRails
NetBeans 6
RadRails
IDEs
Linux + JEdit
Windows + e + cygwin
Tools
• http://railsbros.de
• [email protected][email protected]
• http://mediaventures.de
• http://pkw.de
About Us
• Eure Meinung ist uns wichtig!
• Was hat euch gefallen?
• Was hat euch nicht gefallen?
• Was kann man besser machen?
One Question…
Macht’s gut und Danke
für den Fisch
Herunterladen