SlideShare ist ein Scribd-Unternehmen logo
1 von 65
Downloaden Sie, um offline zu lesen
Ruby on Rails
Web Development that doesn‘t hurt
Dezember 2008



                          www.xing.com/profile/Christian_Feser
                          www.xing.com/profile/Michael_Kram
                          www.xing.com/profile/Jakob_Schroeter
                          www.Marc-Seeger.de
2
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Wissenskasten
                    Generatoren                     Views     Businesslogik      Helper




                  ERB-Templates                    Model                      Assoziationen




                        Console                 Validatoren      Forms           Routing




                         REST                   Migrations       Partial




                        Layout                   Controller   Webservices     Abhängigkeiten
3
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 agenda
   •   has_many
   •   Validatoren
   •   Testing
   •   Security
   •   Performance
   •   Deployment
   •   Diskussion
has_many
Wann wird es aufgerufen?
5
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Once upon a time…




                                                http://api.rubyonrails.com/classes/ActiveRecord/Associations/ClassMethods.html
6
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Magic!
7
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Wait a second…
8
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 What?




                       „attribute functions“
9
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 When?



              require(“my_model.rb“)
10
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 When II?

 My Code                                                     Testing it
11
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 require? It wasn‘t me!
12
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Rails::Initializer
13
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 …or the lazy way…
   • require_association_class()
14
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 In general…
   • This is what you can expect to be loaded:




        •Models
        •Views
        •Controllers
        •Helpers
        •lib/
15
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 How? Meta-Programming!




        look at input                                        manipulate code
16
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
Testing
Fast, Sexy and Svelte
Was ist TDD?
19
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 TDD - Test-Driven Development
20
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Überblick
   • Unit-Test:
     Hiermit werden hauptsächlich Models getestet.
   • Functional-Tests:
     Setzt den Fokus auf das Testen von Controllern
     und Views.
   • Integration-Tests:
     Dient zum Testen der Gesamtfunktionalität der
     Rails-Applikation.
21
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Was macht Rails für uns?
   • Struktur anlegen:
        ▫   Unit Tests (test/unit)
        ▫   Functional Tests (test/functional)
        ▫   Integration Tests (test/integration)
        ▫   Test Fixtures (test/fixtures)

   • Umgebung handeln:
      database.yml
22




Test - Verzeichnisse
Logisch            Physikalisch
23




Fixtures
• Testdaten,
  die Rails vor
  den Tests in
  die Modelle
  lädt
24
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Unit Testing Class
   • Subclass von ActiveSupport::TestCase class
        ▫ class PersonTest < ActiveSupport::TestCase
   • Benötigt test_helper
        ▫ require File.dirname(__FILE__) +
          '/../test_helper'
   • Test Methoden beginnen mit test_
        ▫ test_my_method
   • Mit Assertion Methoden Überprüfung auf true
        ▫ assert_equal 3, Item.count
25
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Unit Test - Demo
26
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Autotest
   ZenTest  http://zentest.rubyforge.org/
27
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Functional-Test
   Testen, ob…
   • eine bestimmte Zeichenkette angezeigt wird.
   • der Controller ein bestimmtes Template anzeigt.
   • der Controller richtig weiterleitet.
   • ob die Seite korrekt geladen worden ist.
   • ob die richtigen Parameter übergeben worden
     sind.
   • das Routing zu dem Controller korrekt
     funktioniert.
   •…
28
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Functional-Test Demo
29
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
30
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Integration-/Acceptance Test
   1. Seite »flights/new« aufrufen.
   2. Überprüfen, ob die Seite fehlerfrei aufgerufen
      werden konnte (HTTP-Status = 200).
   3. Überprüfen, ob das Template »flights/new«
      geladen wurde.
   4. Flight-Formulardaten an die Seite »/flights«
      schicken mit der HTML-Methode POST.
   5. Der Weiterleitung folgen.
   6. Überprüfen, ob die Seite ohne Fehler aufgerufen
      werden konnte (HTTP-Status = 200).
   7. Überprüfen, ob das Template »flights/show«
      geladen wurde.
31




Integration-/Acceptance Test
1.   Seite »flights/new« aufrufen.
2.   Überprüfen, ob die Seite
     fehlerfrei aufgerufen werden
     konnte (HTTP-Status = 200).
3.   Überprüfen, ob das Template
     »flights/new« geladen wurde.
4.   Flight-Formulardaten an die
     Seite »/flights« schicken mit
     der HTML-Methode POST.
5.   Der Weiterleitung folgen.
6.   Überprüfen, ob die Seite ohne
     Fehler aufgerufen werden
     konnte (HTTP-Status = 200).
7.   Überprüfen, ob das Template
     »flights/show« geladen
     wurde.
32
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 SeleniumHQ


   • DEMO




   • http://seleniumhq.org/projects/on-rails/
Security
…on Rails
34
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
35
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Session hijacking




                                                             Session ID
36
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 CookieStore
   • Cookie
        ▫ = Session ID + SHA512(Session ID+ ServerSideSecret)
        ▫  no tampering
   • Encryption of cookie possible
        ▫  user can‘t see what you put in the cookie
   • Especially for forms:
        ▫ ActionController::RequestForgeryProtection
37
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Example




                 source: http://api.rubyonrails.com/classes/ActionController/RequestForgeryProtection/ClassMethods.html
38
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 SQL Injection




                                                             Source: http://xkcd.com/327/
39
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 SQL Injection


            automatically applies SQL Escaping
            (' , quot; , NULL, …)




               Model.find(id)
               Model.find_by_something(something)
40
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 XSS
     <script type=quot;text/javascriptquot;>alert(quot;XSSquot;);</script>
41
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 XSS
   • html_escape()

   • sanitize():


   • Safe ERB plugin
        ▫ checks that the proper methods are used if a string
          is „tainted“ (read from I/O)
Performance
Rails on Speed
43
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 The known…
   • Optimize your code
   • Built-in Features verwenden
   • Nur Daten laden, die auch verwendet werden
             Order.find(:all, :include => [:person])


   • Datenbank-Features nutzen
        ▫ Stored procedures…




                                                http://antoniocangiano.com/2007/02/10/top-10-ruby-on-rails-performance-tips/
44
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Caching is good
   • File-Caching für Controller und Views
        ▫ Einstellung im Environment
45
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Caching im View
   • Page-Caching
        ▫ Im Controller:
             caches_page :index, :show

             expire_page(orders_path)

   • Action-Caching
        ▫ Im Controller:
             caches_action :index, :show

             expire_action(orders_url)
46
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Caching im View
   • Fragment-Caching

             <% cache(:action => quot;listquot;) do %>
              …
             <% end %>


             expire_fragment(:controller => 'orders',
              :action => 'list')
47
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 More caching
   • Im Model: cached_model
        ▫ Plugin für Rails
        ▫ überschreibt model.find-Methoden
        ▫ spart DB-Queries

   • Session Store




                                                             http://rubyfurnace.com/gems/cached_model
48
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 memcached
   • generic, high-performance, distributed memory
     object caching system for speeding up dynamic
     web applications

   • skalierbar, da globaler Cache

        ▫ in Environment-Konfig:
             config.cache_store = :mem_cache_store



                                                             http://www.danga.com/memcached/
Rails scales
Really?
50
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Yep, it does!




                                                             http://limited-overload.de/assets/2006/11/3/Rails-Konferenz_2006.pdf
51
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Frontend tuning
   • CSS- und JavaScript-Dateien zusammenfügen
        ▫ javascript_include_tag
        ▫ stylesheet_link_tag

             javascript_include_tag quot;prototypequot;,
              quot;cartquot;, quot;checkoutquot;, :cache => quot;shop“

             <script type=quot;text/javascriptquot;
              src=quot;/javascripts/shop.jsquot;></script>

   • Gzip-Komprimierung aktivieren
52
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 File-Requests auf mehrere (virtuelle)
 Server verteilen
   • Environment-Einstellung für
       javascript_include_tag, stylesheet_link_tag
       und image_tag

             config.action_controller.asset_host =
              „http://files%d.yourhost.de“


             <img src=quot;http://files0.yourhost.de
              /images/ruby.png„ />
             <img src=quot;http://files1.yourhost.de
              /images/rails.png„ />
53
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




                       Entwicklungs-                         Hardware-
                          kosten                              kosten
Deployment
…get yourself some Rails!
55
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 In the beginning Part 1
   1. cd /path/to/your/rails/app
   2. mongrel_rails cluster::start



   #curl -I 127.0.0.1:8000
   
   HTTP/1.1 200 OK Connection: close Date: Tue, 11 Dec
      2008 23:09:13 GMT Status: 200 OK Server:
      Mongrel 1.0.1 Content-Type: text/html Content-
      Length: 0
56
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 In the beginning Part 2
57
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Today:




          # gem install passenger
          # passenger-install-apache2-module
58
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Passenger                              (= mod_rails = mod_passenger)
59
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Configuration
60
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 JRuby




                               Tomcat                        Glassfish
61
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Glassfish
   First: gem install glassfish

   Then:
   cd /my/rails/app
   glassfish
62
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Tomcat (or anything else…)
   • gem install warbler
   • cd /my/rails/app
   • warble
63
   Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




Yes, it‘s the actual logo…
64
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Diskussion
65
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Quellen
   • Fischer, Jens-Christian: Professionelle Webentwicklung mit Ruby on Rails
     2 (2008): mitp
   • http://errtheblog.com/posts/25-memcaching-rails
   • http://antoniocangiano.com/2007/02/10/top-10-ruby-on-rails-
     performance-tips/
   • http://api.rubyonrails.org/
   • Morsy, Hussein; Otto, Tanja: Ruby on Rails 2 – Das Entwickler-Handbuch
     (2008): Galileo Press
   • Wartala, Ramon; Krutisch, Jan: Webanwendungen mit Ruby on Rails
     (2007): Addision-Wesley Verlag
   • Sang Shin: javapassion.com/rubyonrails/
   • http://wiki.rubyonrails.com/rails/pages/HowtosTesting
   • Bruce, Tate; Curt Hibbs (2006): Durchstarten mit Ruby on Rails
   • http://zentest.rubyforge.org/
   • http://seleniumhq.org/projects/on-rails

Weitere ähnliche Inhalte

Andere mochten auch

W4@md day2011
W4@md day2011W4@md day2011
W4@md day2011MDDAY11
 
Banco latinoamericano
Banco latinoamericanoBanco latinoamericano
Banco latinoamericanoAndyRPulido
 
Atelier 13 des RTB8 - Boutique d'offices et de sites; exemple de Bourges
Atelier 13 des RTB8 - Boutique d'offices et de sites; exemple de BourgesAtelier 13 des RTB8 - Boutique d'offices et de sites; exemple de Bourges
Atelier 13 des RTB8 - Boutique d'offices et de sites; exemple de BourgesR-Evolutions Touristiques de Brive
 
Gcmc. proyecto. tercer foro
Gcmc. proyecto. tercer foroGcmc. proyecto. tercer foro
Gcmc. proyecto. tercer foroAndres Alfonso
 
Ilícitos tributarios.zeidali
Ilícitos tributarios.zeidaliIlícitos tributarios.zeidali
Ilícitos tributarios.zeidaliZEIDALI
 
Vakoo handyhülle iphone 6 6s hülle
Vakoo handyhülle iphone 6 6s hülleVakoo handyhülle iphone 6 6s hülle
Vakoo handyhülle iphone 6 6s hülleMonicakic
 
Change Management ITIL
Change Management ITILChange Management ITIL
Change Management ITILSave10
 
Articulación Sistemica FID
Articulación Sistemica FIDArticulación Sistemica FID
Articulación Sistemica FIDfundafid
 
Gestion information internet_presentation2
Gestion information internet_presentation2Gestion information internet_presentation2
Gestion information internet_presentation2Robin Masur
 
technische Dienstleistungen für Turnarounds in petrochemischen Anlagen
technische Dienstleistungen für Turnarounds in petrochemischen Anlagentechnische Dienstleistungen für Turnarounds in petrochemischen Anlagen
technische Dienstleistungen für Turnarounds in petrochemischen AnlagenMateus Siwek
 
Moebel Schott Hauszeitung Februar 2013
Moebel Schott Hauszeitung Februar 2013Moebel Schott Hauszeitung Februar 2013
Moebel Schott Hauszeitung Februar 2013Möbel Schott GmbH
 

Andere mochten auch (18)

W4@md day2011
W4@md day2011W4@md day2011
W4@md day2011
 
Dieter Rehwinkel (Centrum für Corporate Citizenship Deutschland)
Dieter Rehwinkel (Centrum für Corporate Citizenship Deutschland)Dieter Rehwinkel (Centrum für Corporate Citizenship Deutschland)
Dieter Rehwinkel (Centrum für Corporate Citizenship Deutschland)
 
Banco latinoamericano
Banco latinoamericanoBanco latinoamericano
Banco latinoamericano
 
Firmas electronicas
Firmas electronicasFirmas electronicas
Firmas electronicas
 
Expertinbox
ExpertinboxExpertinbox
Expertinbox
 
Atelier 13 des RTB8 - Boutique d'offices et de sites; exemple de Bourges
Atelier 13 des RTB8 - Boutique d'offices et de sites; exemple de BourgesAtelier 13 des RTB8 - Boutique d'offices et de sites; exemple de Bourges
Atelier 13 des RTB8 - Boutique d'offices et de sites; exemple de Bourges
 
Tierportraits
TierportraitsTierportraits
Tierportraits
 
Gcmc. proyecto. tercer foro
Gcmc. proyecto. tercer foroGcmc. proyecto. tercer foro
Gcmc. proyecto. tercer foro
 
Ilícitos tributarios.zeidali
Ilícitos tributarios.zeidaliIlícitos tributarios.zeidali
Ilícitos tributarios.zeidali
 
Vakoo handyhülle iphone 6 6s hülle
Vakoo handyhülle iphone 6 6s hülleVakoo handyhülle iphone 6 6s hülle
Vakoo handyhülle iphone 6 6s hülle
 
Change Management ITIL
Change Management ITILChange Management ITIL
Change Management ITIL
 
Articulación Sistemica FID
Articulación Sistemica FIDArticulación Sistemica FID
Articulación Sistemica FID
 
Gestion information internet_presentation2
Gestion information internet_presentation2Gestion information internet_presentation2
Gestion information internet_presentation2
 
Especializacion
EspecializacionEspecializacion
Especializacion
 
technische Dienstleistungen für Turnarounds in petrochemischen Anlagen
technische Dienstleistungen für Turnarounds in petrochemischen Anlagentechnische Dienstleistungen für Turnarounds in petrochemischen Anlagen
technische Dienstleistungen für Turnarounds in petrochemischen Anlagen
 
Moebel Schott Hauszeitung Februar 2013
Moebel Schott Hauszeitung Februar 2013Moebel Schott Hauszeitung Februar 2013
Moebel Schott Hauszeitung Februar 2013
 
Ruralitic 2015
Ruralitic 2015Ruralitic 2015
Ruralitic 2015
 
G O C Programm Ablauf 281010
G O C  Programm  Ablauf 281010G O C  Programm  Ablauf 281010
G O C Programm Ablauf 281010
 

Mehr von Jakob

Frontend Performance @ Hochschule der Medien Stuttgart
Frontend Performance @ Hochschule der Medien StuttgartFrontend Performance @ Hochschule der Medien Stuttgart
Frontend Performance @ Hochschule der Medien StuttgartJakob
 
SDC2011: Web Performance Optimization
SDC2011: Web Performance OptimizationSDC2011: Web Performance Optimization
SDC2011: Web Performance OptimizationJakob
 
Automatisierung von Client-seitigen Web-Performance-Optimierungen
Automatisierung von Client-seitigen Web-Performance-OptimierungenAutomatisierung von Client-seitigen Web-Performance-Optimierungen
Automatisierung von Client-seitigen Web-Performance-OptimierungenJakob
 
Client-side Web Performance Optimization [paper]
Client-side Web Performance Optimization [paper]Client-side Web Performance Optimization [paper]
Client-side Web Performance Optimization [paper]Jakob
 
HTML5 Video vs. Flash Video [paper]
HTML5 Video vs. Flash Video [paper]HTML5 Video vs. Flash Video [paper]
HTML5 Video vs. Flash Video [paper]Jakob
 
Client-side Performance Optimizations
Client-side Performance OptimizationsClient-side Performance Optimizations
Client-side Performance OptimizationsJakob
 
Flash vs. Silverlight auf dem mobilen Endgerät
Flash vs. Silverlight auf dem mobilen EndgerätFlash vs. Silverlight auf dem mobilen Endgerät
Flash vs. Silverlight auf dem mobilen EndgerätJakob
 
Flash Video vs. HTML5 Video
Flash Video vs. HTML5 VideoFlash Video vs. HTML5 Video
Flash Video vs. HTML5 VideoJakob
 
Ruby On Rails - 1. Ruby Introduction
Ruby On Rails - 1. Ruby IntroductionRuby On Rails - 1. Ruby Introduction
Ruby On Rails - 1. Ruby IntroductionJakob
 

Mehr von Jakob (9)

Frontend Performance @ Hochschule der Medien Stuttgart
Frontend Performance @ Hochschule der Medien StuttgartFrontend Performance @ Hochschule der Medien Stuttgart
Frontend Performance @ Hochschule der Medien Stuttgart
 
SDC2011: Web Performance Optimization
SDC2011: Web Performance OptimizationSDC2011: Web Performance Optimization
SDC2011: Web Performance Optimization
 
Automatisierung von Client-seitigen Web-Performance-Optimierungen
Automatisierung von Client-seitigen Web-Performance-OptimierungenAutomatisierung von Client-seitigen Web-Performance-Optimierungen
Automatisierung von Client-seitigen Web-Performance-Optimierungen
 
Client-side Web Performance Optimization [paper]
Client-side Web Performance Optimization [paper]Client-side Web Performance Optimization [paper]
Client-side Web Performance Optimization [paper]
 
HTML5 Video vs. Flash Video [paper]
HTML5 Video vs. Flash Video [paper]HTML5 Video vs. Flash Video [paper]
HTML5 Video vs. Flash Video [paper]
 
Client-side Performance Optimizations
Client-side Performance OptimizationsClient-side Performance Optimizations
Client-side Performance Optimizations
 
Flash vs. Silverlight auf dem mobilen Endgerät
Flash vs. Silverlight auf dem mobilen EndgerätFlash vs. Silverlight auf dem mobilen Endgerät
Flash vs. Silverlight auf dem mobilen Endgerät
 
Flash Video vs. HTML5 Video
Flash Video vs. HTML5 VideoFlash Video vs. HTML5 Video
Flash Video vs. HTML5 Video
 
Ruby On Rails - 1. Ruby Introduction
Ruby On Rails - 1. Ruby IntroductionRuby On Rails - 1. Ruby Introduction
Ruby On Rails - 1. Ruby Introduction
 

Ruby On Rails - 3. Rails Addons

  • 1. Ruby on Rails Web Development that doesn‘t hurt Dezember 2008 www.xing.com/profile/Christian_Feser www.xing.com/profile/Michael_Kram www.xing.com/profile/Jakob_Schroeter www.Marc-Seeger.de
  • 2. 2 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Wissenskasten Generatoren Views Businesslogik Helper ERB-Templates Model Assoziationen Console Validatoren Forms Routing REST Migrations Partial Layout Controller Webservices Abhängigkeiten
  • 3. 3 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger agenda • has_many • Validatoren • Testing • Security • Performance • Deployment • Diskussion
  • 4. has_many Wann wird es aufgerufen?
  • 5. 5 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Once upon a time… http://api.rubyonrails.com/classes/ActiveRecord/Associations/ClassMethods.html
  • 6. 6 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Magic!
  • 7. 7 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Wait a second…
  • 8. 8 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger What? „attribute functions“
  • 9. 9 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger When? require(“my_model.rb“)
  • 10. 10 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger When II? My Code Testing it
  • 11. 11 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger require? It wasn‘t me!
  • 12. 12 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Rails::Initializer
  • 13. 13 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger …or the lazy way… • require_association_class()
  • 14. 14 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger In general… • This is what you can expect to be loaded: •Models •Views •Controllers •Helpers •lib/
  • 15. 15 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger How? Meta-Programming! look at input manipulate code
  • 16. 16 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
  • 19. 19 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger TDD - Test-Driven Development
  • 20. 20 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Überblick • Unit-Test: Hiermit werden hauptsächlich Models getestet. • Functional-Tests: Setzt den Fokus auf das Testen von Controllern und Views. • Integration-Tests: Dient zum Testen der Gesamtfunktionalität der Rails-Applikation.
  • 21. 21 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Was macht Rails für uns? • Struktur anlegen: ▫ Unit Tests (test/unit) ▫ Functional Tests (test/functional) ▫ Integration Tests (test/integration) ▫ Test Fixtures (test/fixtures) • Umgebung handeln:  database.yml
  • 23. 23 Fixtures • Testdaten, die Rails vor den Tests in die Modelle lädt
  • 24. 24 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Unit Testing Class • Subclass von ActiveSupport::TestCase class ▫ class PersonTest < ActiveSupport::TestCase • Benötigt test_helper ▫ require File.dirname(__FILE__) + '/../test_helper' • Test Methoden beginnen mit test_ ▫ test_my_method • Mit Assertion Methoden Überprüfung auf true ▫ assert_equal 3, Item.count
  • 25. 25 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Unit Test - Demo
  • 26. 26 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Autotest ZenTest  http://zentest.rubyforge.org/
  • 27. 27 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Functional-Test Testen, ob… • eine bestimmte Zeichenkette angezeigt wird. • der Controller ein bestimmtes Template anzeigt. • der Controller richtig weiterleitet. • ob die Seite korrekt geladen worden ist. • ob die richtigen Parameter übergeben worden sind. • das Routing zu dem Controller korrekt funktioniert. •…
  • 28. 28 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Functional-Test Demo
  • 29. 29 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
  • 30. 30 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Integration-/Acceptance Test 1. Seite »flights/new« aufrufen. 2. Überprüfen, ob die Seite fehlerfrei aufgerufen werden konnte (HTTP-Status = 200). 3. Überprüfen, ob das Template »flights/new« geladen wurde. 4. Flight-Formulardaten an die Seite »/flights« schicken mit der HTML-Methode POST. 5. Der Weiterleitung folgen. 6. Überprüfen, ob die Seite ohne Fehler aufgerufen werden konnte (HTTP-Status = 200). 7. Überprüfen, ob das Template »flights/show« geladen wurde.
  • 31. 31 Integration-/Acceptance Test 1. Seite »flights/new« aufrufen. 2. Überprüfen, ob die Seite fehlerfrei aufgerufen werden konnte (HTTP-Status = 200). 3. Überprüfen, ob das Template »flights/new« geladen wurde. 4. Flight-Formulardaten an die Seite »/flights« schicken mit der HTML-Methode POST. 5. Der Weiterleitung folgen. 6. Überprüfen, ob die Seite ohne Fehler aufgerufen werden konnte (HTTP-Status = 200). 7. Überprüfen, ob das Template »flights/show« geladen wurde.
  • 32. 32 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger SeleniumHQ • DEMO • http://seleniumhq.org/projects/on-rails/
  • 34. 34 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
  • 35. 35 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Session hijacking Session ID
  • 36. 36 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger CookieStore • Cookie ▫ = Session ID + SHA512(Session ID+ ServerSideSecret) ▫  no tampering • Encryption of cookie possible ▫  user can‘t see what you put in the cookie • Especially for forms: ▫ ActionController::RequestForgeryProtection
  • 37. 37 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Example source: http://api.rubyonrails.com/classes/ActionController/RequestForgeryProtection/ClassMethods.html
  • 38. 38 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger SQL Injection Source: http://xkcd.com/327/
  • 39. 39 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger SQL Injection automatically applies SQL Escaping (' , quot; , NULL, …) Model.find(id) Model.find_by_something(something)
  • 40. 40 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger XSS <script type=quot;text/javascriptquot;>alert(quot;XSSquot;);</script>
  • 41. 41 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger XSS • html_escape() • sanitize(): • Safe ERB plugin ▫ checks that the proper methods are used if a string is „tainted“ (read from I/O)
  • 43. 43 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger The known… • Optimize your code • Built-in Features verwenden • Nur Daten laden, die auch verwendet werden Order.find(:all, :include => [:person]) • Datenbank-Features nutzen ▫ Stored procedures… http://antoniocangiano.com/2007/02/10/top-10-ruby-on-rails-performance-tips/
  • 44. 44 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Caching is good • File-Caching für Controller und Views ▫ Einstellung im Environment
  • 45. 45 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Caching im View • Page-Caching ▫ Im Controller: caches_page :index, :show expire_page(orders_path) • Action-Caching ▫ Im Controller: caches_action :index, :show expire_action(orders_url)
  • 46. 46 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Caching im View • Fragment-Caching <% cache(:action => quot;listquot;) do %> … <% end %> expire_fragment(:controller => 'orders', :action => 'list')
  • 47. 47 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger More caching • Im Model: cached_model ▫ Plugin für Rails ▫ überschreibt model.find-Methoden ▫ spart DB-Queries • Session Store http://rubyfurnace.com/gems/cached_model
  • 48. 48 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger memcached • generic, high-performance, distributed memory object caching system for speeding up dynamic web applications • skalierbar, da globaler Cache ▫ in Environment-Konfig: config.cache_store = :mem_cache_store http://www.danga.com/memcached/
  • 50. 50 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Yep, it does! http://limited-overload.de/assets/2006/11/3/Rails-Konferenz_2006.pdf
  • 51. 51 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Frontend tuning • CSS- und JavaScript-Dateien zusammenfügen ▫ javascript_include_tag ▫ stylesheet_link_tag javascript_include_tag quot;prototypequot;, quot;cartquot;, quot;checkoutquot;, :cache => quot;shop“ <script type=quot;text/javascriptquot; src=quot;/javascripts/shop.jsquot;></script> • Gzip-Komprimierung aktivieren
  • 52. 52 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger File-Requests auf mehrere (virtuelle) Server verteilen • Environment-Einstellung für javascript_include_tag, stylesheet_link_tag und image_tag config.action_controller.asset_host = „http://files%d.yourhost.de“ <img src=quot;http://files0.yourhost.de /images/ruby.png„ /> <img src=quot;http://files1.yourhost.de /images/rails.png„ />
  • 53. 53 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Entwicklungs- Hardware- kosten kosten
  • 55. 55 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger In the beginning Part 1 1. cd /path/to/your/rails/app 2. mongrel_rails cluster::start #curl -I 127.0.0.1:8000  HTTP/1.1 200 OK Connection: close Date: Tue, 11 Dec 2008 23:09:13 GMT Status: 200 OK Server: Mongrel 1.0.1 Content-Type: text/html Content- Length: 0
  • 56. 56 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger In the beginning Part 2
  • 57. 57 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Today: # gem install passenger # passenger-install-apache2-module
  • 58. 58 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Passenger (= mod_rails = mod_passenger)
  • 59. 59 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Configuration
  • 60. 60 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger JRuby Tomcat Glassfish
  • 61. 61 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Glassfish First: gem install glassfish Then: cd /my/rails/app glassfish
  • 62. 62 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Tomcat (or anything else…) • gem install warbler • cd /my/rails/app • warble
  • 63. 63 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Yes, it‘s the actual logo…
  • 64. 64 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Diskussion
  • 65. 65 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Quellen • Fischer, Jens-Christian: Professionelle Webentwicklung mit Ruby on Rails 2 (2008): mitp • http://errtheblog.com/posts/25-memcaching-rails • http://antoniocangiano.com/2007/02/10/top-10-ruby-on-rails- performance-tips/ • http://api.rubyonrails.org/ • Morsy, Hussein; Otto, Tanja: Ruby on Rails 2 – Das Entwickler-Handbuch (2008): Galileo Press • Wartala, Ramon; Krutisch, Jan: Webanwendungen mit Ruby on Rails (2007): Addision-Wesley Verlag • Sang Shin: javapassion.com/rubyonrails/ • http://wiki.rubyonrails.com/rails/pages/HowtosTesting • Bruce, Tate; Curt Hibbs (2006): Durchstarten mit Ruby on Rails • http://zentest.rubyforge.org/ • http://seleniumhq.org/projects/on-rails