Ruby on Rails
Web Development that doesn‘t hurt
Dezember 2008



                          www.xing.com/profile/Christian_...
2
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Wissenskasten
                    Generatoren           ...
3
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




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




 Once upon a time…




                                  ...
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                                     ...
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 load...
15
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 How? Meta-Programming!




        look at input       ...
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äch...
21
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Was macht Rails für uns?
   • Struktur anlegen:
       ...
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::Tes...
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 Zeic...
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« ...
31




Integration-/Acceptance Test
1.   Seite »flights/new« aufrufen.
2.   Überprüfen, ob die Seite
     fehlerfrei aufge...
32
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 SeleniumHQ


   • DEMO




   • http://seleniumhq.org/p...
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




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




 CookieStore
   • Cookie
        ▫ = Session ID + SHA512...
37
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Example




                 source: http://api.rubyonr...
38
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 SQL Injection




                                     ...
39
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 SQL Injection


            automatically applies SQL E...
40
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




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




 XSS
   • html_escape()

   • sanitize():


   • Safe ER...
Performance
Rails on Speed
43
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 The known…
   • Optimize your code
   • Built-in Featur...
44
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Caching is good
   • File-Caching für Controller und Vi...
45
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Caching im View
   • Page-Caching
        ▫ Im Controll...
46
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Caching im View
   • Fragment-Caching

             <% ...
47
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 More caching
   • Im Model: cached_model
        ▫ Plug...
48
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 memcached
   • generic, high-performance, distributed m...
Rails scales
Really?
50
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Yep, it does!




                                     ...
51
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Frontend tuning
   • CSS- und JavaScript-Dateien zusamm...
52
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 File-Requests auf mehrere (virtuelle)
 Server verteilen...
53
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




                       Entwicklungs-                    ...
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/ap...
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
          ...
58
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




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




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




 JRuby




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




 Glassfish
   First: gem install glassfish

   Then:
   ...
62
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Tomcat (or anything else…)
   • gem install warbler
   ...
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 We...
Upcoming SlideShare
Loading in...5
×

Ruby On Rails - 3. Rails Addons

2,918

Published on

A 90 min addon for Ruby On Rails Programming by Christian Feser, Michael Kram, Jakob Schröter and Marc Seeger.

Contents:
Testing
Test-Driven Development
Security
Performance
Caching
Deployment

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,918
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
36
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Ruby On Rails - 3. Rails Addons

  1. 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. 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. 3 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger agenda • has_many • Validatoren • Testing • Security • Performance • Deployment • Diskussion
  4. 4. has_many Wann wird es aufgerufen?
  5. 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. 6 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Magic!
  7. 7. 7 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Wait a second…
  8. 8. 8 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger What? „attribute functions“
  9. 9. 9 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger When? require(“my_model.rb“)
  10. 10. 10 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger When II? My Code Testing it
  11. 11. 11 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger require? It wasn‘t me!
  12. 12. 12 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Rails::Initializer
  13. 13. 13 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger …or the lazy way… • require_association_class()
  14. 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. 15 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger How? Meta-Programming! look at input manipulate code
  16. 16. 16 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
  17. 17. Testing Fast, Sexy and Svelte
  18. 18. Was ist TDD?
  19. 19. 19 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger TDD - Test-Driven Development
  20. 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. 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. 22. 22 Test - Verzeichnisse Logisch Physikalisch
  23. 23. 23 Fixtures • Testdaten, die Rails vor den Tests in die Modelle lädt
  24. 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. 25 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Unit Test - Demo
  26. 26. 26 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Autotest ZenTest  http://zentest.rubyforge.org/
  27. 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. 28 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Functional-Test Demo
  29. 29. 29 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
  30. 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. 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. 32 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger SeleniumHQ • DEMO • http://seleniumhq.org/projects/on-rails/
  33. 33. Security …on Rails
  34. 34. 34 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
  35. 35. 35 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Session hijacking Session ID
  36. 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. 37 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Example source: http://api.rubyonrails.com/classes/ActionController/RequestForgeryProtection/ClassMethods.html
  38. 38. 38 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger SQL Injection Source: http://xkcd.com/327/
  39. 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. 40 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger XSS <script type=quot;text/javascriptquot;>alert(quot;XSSquot;);</script>
  41. 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)
  42. 42. Performance Rails on Speed
  43. 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. 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. 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. 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. 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. 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/
  49. 49. Rails scales Really?
  50. 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. 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. 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. 53 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Entwicklungs- Hardware- kosten kosten
  54. 54. Deployment …get yourself some Rails!
  55. 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. 56 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger In the beginning Part 2
  57. 57. 57 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Today: # gem install passenger # passenger-install-apache2-module
  58. 58. 58 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Passenger (= mod_rails = mod_passenger)
  59. 59. 59 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Configuration
  60. 60. 60 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger JRuby Tomcat Glassfish
  61. 61. 61 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Glassfish First: gem install glassfish Then: cd /my/rails/app glassfish
  62. 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. 63 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Yes, it‘s the actual logo…
  64. 64. 64 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Diskussion
  65. 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
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×