Inhaltsverzeichnis | 8 |
Vorwort | 18 |
Vorwort zur 2. Auflage | 20 |
Vorwort zur 3. Auflage | 22 |
Danksagung | 24 |
Kapitel 1 Einleitung | 26 |
1.1 Für wen dieses Buch bestimmt ist | 27 |
1.2 Organisation des Buches | 28 |
1.3 Web-Site zum Buch | 30 |
1.4 Feedback | 30 |
Kapitel 2 Überblick und Installation | 32 |
2.1 Was ist Ruby on Rails? | 32 |
2.2 Bestandteile von Rails | 35 |
2.2.1 Komponenten und Zusammenspiel | 35 |
2.2.2 Action Pack | 36 |
2.2.3 Active Record | 36 |
2.2.4 Action Mailer | 37 |
2.2.5 Ajax | 37 |
2.2.6 Unit Tests | 37 |
2.3 Installation | 37 |
2.3.1 Windows | 37 |
2.3.2 Mac | 38 |
2.3.3 Linux | 38 |
2.3.4 Aktualisierung | 38 |
2.3.5 Datenbank | 38 |
2.3.6 Glückwunsch! Willkommen an Bord! | 38 |
Kapitel 3 Hands-on Rails | 40 |
3.1 Entwicklungsphilosophie | 41 |
3.2 Domain-Modell | 41 |
3.3 OnTrack Product Backlog | 42 |
3.4 Aufsetzen der Infrastruktur | 43 |
3.5 Projekte erfassen, bearbeiten und löschen | 45 |
3.5.1 Modell erzeugen | 45 |
3.5.2 Datenbankmigration | 47 |
3.5.3 Controller | 51 |
3.6 Iterationen hinzufügen | 52 |
3.7 Zwischenstand | 59 |
3.8 Iterationen anzeigen | 59 |
3.9 Iterationen bearbeiten und löschen | 61 |
3.10 Tasks hinzufügen | 64 |
3.11 Tasks anzeigen, bearbeiten und löschen | 67 |
3.12 Struktur in die Seiten bringen | 69 |
3.13 Validierung | 70 |
3.14 Benutzerverwaltung | 74 |
3.15 Login | 76 |
3.16 Tasks zuweisen | 79 |
3.17 Endstand und Ausblick | 80 |
Kapitel 4 Active Record | 82 |
4.1 Active Record-Klassen | 82 |
4.1.1 Mehr über Modellattribute | 84 |
4.1.2 Mehr über Primärschlüssel | 85 |
4.1.3 Zusammengesetzte Primärschlüssel | 86 |
4.1.4 Mehr über Tabellennamen | 86 |
4.2 Active Record direkt verwenden | 88 |
4.3 Die Rails-Konsole | 88 |
4.4 Objekte erzeugen, laden, aktualisieren und löschen | 89 |
4.4.1 Erzeugung | 90 |
4.4.2 Objekte laden | 90 |
4.4.3 Objekte aktualisieren | 91 |
4.4.4 Objekte löschen | 93 |
4.5 Mehr über Finder | 93 |
4.5.1 Suchbedingungen: conditions | 93 |
4.5.2 SQL-Injection vermeiden | 95 |
4.5.3 Ordnung schaffen: order | 96 |
4.5.4 Limitieren: limit | 96 |
4.5.5 Seitenweise: limit und offset | 96 |
4.5.6 Weitere Parameter: joins und include | 97 |
4.6 Dynamische Finder | 98 |
4.7 Kann ich weiterhin SQL verwenden? | 99 |
4.8 Metadaten – Daten ¨uber Daten | 100 |
4.9 Assoziationen | 101 |
4.9.1 Grundsätzliches | 101 |
4.9.2 1:1-Beziehungen: has one – belongs to | 103 |
4.9.3 1:N-Beziehungen: has many – belongs to | 109 |
4.9.4 N:M-Beziehungen: has and belongs to many | 115 |
4.9.5 Polymorphe Assoziationen: has many – belongs to | 119 |
4.9.6 has many :through | 122 |
4.10 Aggregation | 124 |
4.11 Vererbung | 125 |
4.12 Transaktionen | 128 |
4.13 Von Bäumen und Listen | 130 |
4.13.1 acts as list | 131 |
4.13.2 acts as tree | 133 |
4.14 Validierung | 135 |
4.14.1 Validierungs-Klassenmethoden | 136 |
4.15 Callbacks | 140 |
4.15.1 Überschreiben von Callback-Methoden | 141 |
4.15.2 Callback-Makros | 141 |
4.15.3 Observer | 143 |
4.16 Konkurrierende Zugriffe und Locking | 144 |
4.16.1 Optimistisches Locking | 144 |
Kapitel 5 Action Controller | 146 |
5.1 Controller-Grundlagen | 146 |
5.1.1 Actions | 147 |
5.1.2 Responses | 148 |
5.2 Datenaustausch | 151 |
5.2.1 Vom Controller zum View | 151 |
5.2.2 Vom View zum Controller | 152 |
5.2.3 Aus der Action in den View und zurück | 154 |
5.3 Redirects | 155 |
5.4 GET vs. POST | 156 |
5.5 Unterschiedliche Response-Formate: respond to | 158 |
5.6 Zugriff auf Datens¨atze einschr¨anken | 160 |
5.7 Ausnahme fangen mit rescue from | 161 |
5.8 Sessions | 162 |
5.8.1 Session-Daten löschen | 164 |
5.9 Der Flash-Speicher | 165 |
5.9.1 Weitere Flash-Methoden | 166 |
5.10 Filter | 166 |
5.10.1 Around-Filter | 167 |
5.10.2 Bedingungen | 168 |
5.10.3 Filterklassen und Inline-Filter | 169 |
5.10.4 Filtervererbung | 169 |
5.10.5 Filterketten | 170 |
5.11 HTTP-Authentifikation | 171 |
5.12 Routing und URL-Generierung | 172 |
5.12.1 Routing | 172 |
5.12.2 Anpassung des Routings | 174 |
5.12.3 Root Route | 175 |
5.12.4 Named Routes | 175 |
5.12.5 URL-Generierung | 177 |
5.13 Layout | 178 |
5.13.1 Automatische Layoutzuweisung | 179 |
5.13.2 Explizite Layoutzuweisung | 179 |
5.13.3 Dynamische Bestimmung des Layouts | 180 |
5.13.4 Action-spezifische Layouts | 180 |
5.14 Datei-Download | 181 |
5.14.1 Die Methode send data | 181 |
5.14.2 Die Methode send file | 182 |
5.14.3 Unsichere Dateidownloads verhindern | 182 |
5.15 Datei-Upload | 183 |
5.16 Rails-Konsole für Controller nutzen | 183 |
Kapitel 6 Action View | 186 |
6.1 HTML-Templates | 186 |
6.2 Helper-Module | 188 |
6.3 Action View Helper | 190 |
6.3.1 Formulare | 190 |
6.3.2 Schutz vor Cross-Site Request Forgery | 192 |
6.3.3 Formular-Helper mit Bezug zu Modellen | 193 |
6.3.4 Formular-Helper ohne Bezug zu Modellen | 195 |
6.3.5 HTML-Tags | 196 |
6.3.6 Texte und Zahlen | 196 |
6.3.7 Datum und Zeit | 197 |
6.3.8 Auswahlboxen | 198 |
6.3.9 Verweise und URLs | 200 |
6.3.10 Ressourcen einbinden | 202 |
6.3.11 JavaScript | 203 |
6.3.12 Code speichern und wiederverwenden | 203 |
6.3.13 Debugging | 204 |
6.3.14 HTML-Code filtern | 204 |
6.4 Layouts | 205 |
6.4.1 Layout aus Views beeinflussen | 205 |
6.5 Partial Views | 206 |
6.6 Anzeige Fehlermeldungen | 210 |
6.7 XML-Templates | 211 |
6.8 RJS-Templates | 212 |
6.9 Caching | 212 |
6.9.1 Seiten-Caching | 213 |
6.9.2 Action-Caching | 213 |
6.9.3 Fragment-Caching | 215 |
6.9.4 Was Sie nicht cachen sollten | 218 |
6.9.5 Caching testen | 218 |
6.9.6 Action Cache Plugin | 218 |
Kapitel 7 RESTful Rails | 220 |
7.1 Was ist REST? | 221 |
7.2 Warum REST? | 222 |
7.3 Was ist neu? | 222 |
7.4 Vorbereitung | 223 |
7.5 Ressource Scaffolding | 223 |
7.6 Das Modell | 224 |
7.7 Der Controller | 224 |
7.7.1 REST-URLs | 225 |
7.7.2 REST-Actions verwenden respond to | 226 |
7.7.3 Accept-Feld im HTTP-Header | 227 |
7.7.4 Formatangabe via URL | 228 |
7.8 REST-URLs in Views | 229 |
7.8.1 New und Edit | 230 |
7.8.2 Path-Methoden in Formularen: Create und Update | 231 |
7.8.3 Destroy | 233 |
7.9 URL-Methoden im Controller | 234 |
7.10 REST-Routing | 235 |
7.10.1 Konventionen | 235 |
7.10.2 Customizing | 235 |
7.11 Verschachtelte Ressourcen | 236 |
7.11.1 Anpassung des Controllers | 238 |
7.11.2 Neue Helper für verschachtelte Ressourcen | 239 |
7.11.3 Zufügen neuer Iterationen | 241 |
7.11.4 Bearbeiten existierender Iterationen | 243 |
7.12 Eigene Actions | 244 |
7.12.1 Sind wir noch DRY? | 246 |
7.13 Eigene Formate | 246 |
7.14 RESTful AJAX | 247 |
7.15 Testen | 249 |
7.16 RESTful Clients: ActiveResource | 250 |
7.17 Abschließend | 251 |
Kapitel 8 Internationalisierung | 252 |
8.1 Internationalisierung oder Lokalisierung? | 253 |
8.2 Lokalisierung und Codes | 253 |
8.2.1 Language Tag | 253 |
8.2.2 Locale | 253 |
8.3 Checkliste | 254 |
8.4 Internationalisierung vorbereiten | 255 |
8.5 Ruby Gettext-Package | 256 |
8.5.1 Installation | 257 |
8.5.2 Texte übersetzen | 257 |
8.5.3 Die Schritte im Überblick | 262 |
8.5.4 Anwendung und Gettext zusammenbringen | 262 |
8.5.5 Lokalisierte Templates | 263 |
8.5.6 Controller | 263 |
8.5.7 Modelle | 264 |
8.5.8 Dynamische Texte und Pluralisierung | 266 |
8.5.9 Datum, Zahlen und Währungen | 268 |
8.5.10 Wochen- und Monatsnamen | 270 |
8.5.11 Sortierung | 272 |
8.5.12 Zusammenfassung | 273 |
Kapitel 9 Action Mailer | 274 |
9.1 E-Mail-Versand | 274 |
9.1.1 E-Mail erstellen | 274 |
9.1.2 E-Mail-Objekt erzeugen | 278 |
9.1.3 E-Mail versenden | 279 |
9.1.4 Testen | 281 |
9.1.5 Tipp zum zuverlässigen E-Mail-Versand | 282 |
9.1.6 Multipart E-Mails | 283 |
9.2 E-Mail-Empfang | 285 |
9.2.1 E-Mail empfangen | 286 |
9.2.2 Empfang testen | 287 |
Kapitel 10 Ajax | 288 |
10.1 Ajax und Rails | 290 |
10.2 Hello, Ajax World | 291 |
10.3 Ajax-Formulare | 292 |
10.3.1 Task-Schnellerfassung | 292 |
10.3.2 Ajax-Formulare und JavaScript | 295 |
10.4 Feldbeobachter | 295 |
10.4.1 Beispiel: Tasks filtern | 297 |
10.5 Callback-Methoden | 299 |
10.6 Drag and Drop | 300 |
10.6.1 Einkaufen per Drag and Drop | 300 |
10.6.2 Sortieren per Drag and Drop | 303 |
10.7 Autocompletion | 306 |
10.8 RJS Templates | 307 |
10.8.1 Hinzufügen von Tasks visuell optimieren | 308 |
10.8.2 Weitere Techniken | 311 |
10.8.3 Debugging und Testen | 314 |
10.9 Zusammenfassung und Ausblick | 315 |
Kapitel 11 Produktion | 316 |
11.1 Umgebungen in Rails | 316 |
11.1.1 Umgebung definieren | 316 |
11.1.2 Entwicklung | 317 |
11.1.3 Test | 317 |
11.1.4 Produktion | 317 |
11.1.5 Umgebung hinzufügen | 318 |
11.2 Webserver und Datenbank | 319 |
11.2.1 Datenbank | 319 |
11.2.2 Webserver Cluster | 319 |
11.2.3 Apache und Mongrel | 320 |
11.2.4 Alternativen | 323 |
11.3 Skalierung | 324 |
11.4 Session-Speicher | 325 |
11.5 Tipps zur Performanz | 326 |
11.6 Sicherheit | 327 |
11.7 Auslieferung | 330 |
11.8 Wartung | 330 |
11.9 Überwachung | 331 |
Kapitel 12 Deployment mit Capistrano (und Subversion) | 334 |
12.1 Quickstart: Capistrano in 10 Minuten | 335 |
12.1.1 Voraussetzungen | 335 |
12.1.2 Installation von Capistrano | 337 |
12.1.3 Anwendung Capistrano-ready machen | 337 |
12.1.4 Konfiguration | 338 |
12.1.5 Setup des entfernten Verzeichnisses | 340 |
12.1.6 Erstes Deployment | 340 |
12.1.7 Fallstricke | 343 |
12.1.8 Nachfolgende Deployments | 344 |
12.2 Datenbanksetup und Migration | 344 |
12.3 Rollback eines Release | 345 |
12.3.1 Rollback mit Datenbankmigration | 345 |
12.4 Tasks | 345 |
12.4.1 Ausführen von Tasks | 346 |
12.4.2 Mehr über run und sudo | 348 |
12.4.3 Weitere Task-Helper: delete, put und render | 349 |
12.4.4 Transaktionen und Rollbacks | 349 |
12.4.5 Überschreiben von Standardtasks | 350 |
12.4.6 Tasks erweitern: Before- und After-Tasks | 350 |
12.5 Variablen | 351 |
12.6 FastCGI-Utilities | 352 |
12.6.1 Spawner | 352 |
12.6.2 Reaper | 353 |
12.7 Gemeinsame Dateien – das Shared-Verzeichnis | 353 |
12.7.1 Eine ”persistente“ Datenbank-Konfiguration | 353 |
12.8 Capistrano-Referenz | 355 |
12.9 Capistrano-Konfiguration: deploy.rb | 356 |
Kapitel 13 Testgetriebene Entwicklungmit Ruby und Test::Unit | 358 |
13.1 Unit Tests – eine Definition | 358 |
13.2 Ein Beispiel | 359 |
13.3 Warum testen? | 360 |
13.4 Test::Unit | 361 |
13.4.1 Strukturierung von Unit Tests | 362 |
13.4.2 Wohin mit den Tests? | 364 |
13.4.3 Ausführen der Tests | 364 |
13.4.4 Unabhängigkeit von Tests | 365 |
13.5 Testgetriebene Softwareentwicklung | 365 |
13.5.1 TODO-Listen | 367 |
13.5.2 Beispiel | 367 |
13.6 Retrospektive | 369 |
Kapitel 14 Testgetriebene Entwicklungmit Ruby on Rails | 370 |
14.1 Generierte Testklassen | 370 |
14.2 Testdatenbank | 371 |
14.3 Testausführung mit Rake | 372 |
14.4 Eine Programmierepisode | 372 |
14.4.1 Entwicklung einer Modellklasse | 373 |
14.4.2 Entwicklung des Controllers | 377 |
14.4.3 Programmierung des Views | 378 |
14.4.4 Geänderte Anforderungen | 380 |
14.4.5 Retrospektive | 386 |
14.5 Unit Tests – Testen von Modellklassen | 387 |
14.5.1 Struktur und Elemente von Modelltests | 387 |
14.5.2 Testmethoden | 388 |
14.5.3 Testdaten – Fixtures | 389 |
14.5.4 Transaktionale Fixtures | 392 |
14.5.5 Testrezepte für Modelle | 392 |
14.6 Funktionale Tests | 398 |
14.6.1 Testmethoden | 398 |
14.6.2 Kontrollfluss-Assertions | 399 |
14.6.3 Routing-Assertions | 401 |
14.6.4 Datencontainer-Assertions | 402 |
14.6.5 Template-Assertions | 402 |
14.6.6 Testrezepte für Controller und Views | 404 |
14.7 Integrationstests | 408 |
14.7.1 Test-DSLs | 410 |
14.7.2 Sessions | 411 |
14.8 Testen von E-Mails | 412 |
14.9 Mock-Objekte | 412 |
14.10 Zusammenfassung | 413 |
14.11 Assertions – U¨ bersicht | 414 |
Anhang | 416 |
Literaturverzeichnis | 424 |
Stichwortverzeichnis | 426 |