65
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

Ruby On Rails - 3. Rails Addons

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 2: Ruby On Rails - 3. Rails Addons

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

Wissenskasten

2

Generatoren Views Businesslogik Helper

ERB-Templates Model Assoziationen

Console Validatoren Forms Routing

REST Migrations Partial

Layout Controller Webservices Abhängigkeiten

Page 3: Ruby On Rails - 3. Rails Addons

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

agenda

• has_many

• Validatoren

• Testing

• Security

• Performance

• Deployment

• Diskussion

3

Page 4: Ruby On Rails - 3. Rails Addons

has_manyWann wird es aufgerufen?

Page 5: Ruby On Rails - 3. Rails Addons

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

Once upon a time…

5

http://api.rubyonrails.com/classes/ActiveRecord/Associations/ClassMethods.html

Page 14: Ruby On Rails - 3. Rails Addons

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

In general…

• This is what you can expect to be loaded:

14

•Models•Views•Controllers•Helpers•lib/

Page 17: Ruby On Rails - 3. Rails Addons

TestingFast, Sexy and Svelte

Page 18: Ruby On Rails - 3. Rails Addons

Was ist TDD?

Page 20: Ruby On Rails - 3. Rails Addons

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.

20

Page 21: Ruby On Rails - 3. Rails Addons

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

21

Page 22: Ruby On Rails - 3. Rails Addons

Test - Verzeichnisse

Logisch Physikalisch

22

Page 23: Ruby On Rails - 3. Rails Addons

Fixtures

• Testdaten, die Rails vor den Tests in die Modelle lädt

23

Page 24: Ruby On Rails - 3. Rails Addons

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

24

Page 27: Ruby On Rails - 3. Rails Addons

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.• …

27

Page 30: Ruby On Rails - 3. Rails Addons

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.

30

Page 31: Ruby On Rails - 3. Rails Addons

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

Page 32: Ruby On Rails - 3. Rails Addons

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

SeleniumHQ

• DEMO

• http://seleniumhq.org/projects/on-rails/

32

Page 33: Ruby On Rails - 3. Rails Addons

Security…on Rails

Page 36: Ruby On Rails - 3. Rails Addons

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

36

Page 37: Ruby On Rails - 3. Rails Addons

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

Example

37

source: http://api.rubyonrails.com/classes/ActionController/RequestForgeryProtection/ClassMethods.html

Page 39: Ruby On Rails - 3. Rails Addons

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

SQL Injection

Model.find(id)Model.find_by_something(something)

39

automatically applies SQL Escaping(' , " , NULL, …)

Page 40: Ruby On Rails - 3. Rails Addons

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

XSS

40

<script type="text/javascript">alert("XSS");</script>

Page 41: Ruby On Rails - 3. Rails Addons

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 stringis „tainted“ (read from I/O)

41

Page 42: Ruby On Rails - 3. Rails Addons

PerformanceRails on Speed

Page 43: Ruby On Rails - 3. Rails Addons

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

The known…

43

http://antoniocangiano.com/2007/02/10/top-10-ruby-on-rails-performance-tips/

• Optimize your code

• Built-in Features verwenden

• Nur Daten laden, die auch verwendet werdenOrder.find(:all, :include => [:person])

• Datenbank-Features nutzen

▫ Stored procedures…

Page 44: Ruby On Rails - 3. Rails Addons

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

Caching is good

44

• File-Caching für Controller und Views

▫ Einstellung im Environment

Page 45: Ruby On Rails - 3. Rails Addons

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

Caching im View

45

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

expire_page(orders_path)

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

expire_action(orders_url)

Page 46: Ruby On Rails - 3. Rails Addons

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

Caching im View

46

• Fragment-Caching

<% cache(:action => "list") do %>

<% end %>

expire_fragment(:controller => 'orders',

:action => 'list')

Page 47: Ruby On Rails - 3. Rails Addons

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

More caching

47

http://rubyfurnace.com/gems/cached_model

• Im Model: cached_model

▫ Plugin für Rails

▫ überschreibt model.find-Methoden

▫ spart DB-Queries

• Session Store

Page 48: Ruby On Rails - 3. Rails Addons

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

memcached

48

http://www.danga.com/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

Page 49: Ruby On Rails - 3. Rails Addons

Rails scalesReally?

Page 50: Ruby On Rails - 3. Rails Addons

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

Yep, it does!

50

http://limited-overload.de/assets/2006/11/3/Rails-Konferenz_2006.pdf

Page 51: Ruby On Rails - 3. Rails Addons

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

Frontend tuning

51

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

javascript_include_tag "prototype",

"cart", "checkout", :cache => "shop“

<script type="text/javascript"

src="/javascripts/shop.js"></script>

• Gzip-Komprimierung aktivieren

Page 52: Ruby On Rails - 3. Rails Addons

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

File-Requests auf mehrere (virtuelle)

Server verteilen

52

• Environment-Einstellung für javascript_include_tag, stylesheet_link_tagund image_tag

config.action_controller.asset_host =

„http://files%d.yourhost.de“

<img src="http://files0.yourhost.de

/images/ruby.png„ />

<img src="http://files1.yourhost.de

/images/rails.png„ />

Page 54: Ruby On Rails - 3. Rails Addons

Deployment…get yourself some Rails!

Page 55: Ruby On Rails - 3. Rails Addons

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

In the beginning Part 1

1. cd /path/to/your/rails/app2. mongrel_rails cluster::start

#curl -I 127.0.0.1:8000

HTTP/1.1 200 OK Connection: close Date: Tue, 11 Dec2008 23:09:13 GMT Status: 200 OK Server: Mongrel 1.0.1 Content-Type: text/html Content-Length: 0

55

Page 57: Ruby On Rails - 3. Rails Addons

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

Today:

57

# gem install passenger# passenger-install-apache2-module

Page 61: Ruby On Rails - 3. Rails Addons

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

Glassfish

First: gem install glassfish

Then:

cd /my/rails/app

glassfish

61

Page 62: Ruby On Rails - 3. Rails Addons

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

Tomcat (or anything else…)

• gem install warbler

• cd /my/rails/app

• warble

62

Page 65: Ruby On Rails - 3. Rails Addons

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

Quellen

• Fischer, Jens-Christian: Professionelle Webentwicklung mit Ruby on Rails2 (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

65