Ruby On Rails - 3. Rails Addons

3,505 views

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
  • Be the first to comment

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

×