Ruby on Rails SS09 08

500
-1

Published on

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

  • Be the first to like this

No Downloads
Views
Total Views
500
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
































































  • Ruby on Rails SS09 08

    1. 1. Daniel Dengler web developer Ruby on Rails Workshop SS 2009 „Ruby on Rails“ and the Rails-Logo are registered trademarks of David Heinemeier Hansson – www.rubyonrails.org
    2. 2. 8 Ruby on Rails ActiveRecord (3) Routing & REST
    3. 3. ActiveRecord Finder Named Scopes Validierung Berechnungen
    4. 4. ActiveRecord Finder Named Scopes Validierung Berechnungen
    5. 5. Find Methode nd(Primärschlüssel) nd(Array von Primärschlüsseln)
    6. 6. Find Methode Project.find(1) # liefert Projekt mit der id 1 Project.find([1,2]) # liefert Projekte mit den ids 1 und 2
    7. 7. Bedingungen nd(Typ, :conditions => Conditions) Typ kann sein: • : rst (liefert das erste Element) • :last (liefert das letzte Element) • :all (liefert alle Elemente) Conditions können sein: • String • Array • Hash
    8. 8. Bedingungen Project.find(:first, :conditions => quot;title = 'one'quot;) # ACHTUNG: Kein vordefinierter Schutz gegen SQL-Injections # bei der Verwendung von Strings Project.find(:first, :conditions => [quot;title = ?quot;, quot;onequot;]) Project.find(:first, :conditions => {:title => quot;onequot;})
    9. 9. Kurzformen nd(Typ, Optionen) Typ kann ersetzt werden durch: • rst(Optionen) • last(Optionen) • all(Optionen)
    10. 10. Kurzformen Project.first(:conditions => {:title => quot;onequot;}) Project.last(:conditions => {:title => quot;onequot;}) Project.all(:conditions => {:title => quot;onequot;}) Project.all
    11. 11. Sortieren nd(Typ, :order => Sortierung)
    12. 12. Sortieren Project.all(:order => quot;titlequot;) # Alle Projekte aufsteigend nach Titel sortiert Project.all(:order => quot;title DESCquot;) # Alle Projekte absteigend nach Titel sortiert Project.all(:order => quot;title DESC, created_at ASCquot;) # Alle Projekte absteigend nach Titel und aufsteigend # nach Erstellungsdatum sortiert, falls doppelt vorhanden
    13. 13. Limitierung und Versatz nd(Typ, :limit => Limitierung) nd(Typ, :limit => Limitierung, :offset => Versatz )
    14. 14. Limitierung und Versatz Project.all(:limit => 10) # liefert max. 10 Projekte Project.all(:limit => 10, :offset => 10) # liefert max. 10 Projekte beginnend bei dem 10.
    15. 15. N + 1 Problem Es wird eine Operation auf einer Relation ausgeführt und damit für jedes Objekt eine neue Datenbankabfrage generiert.
    16. 16. N + 1 Problem @project = Project.all @project.each do |p| puts p.tasks.collect {|t| t.title} # Lädt beim Aufruf jeweils ein Objekt end # Anzahl der Queries: # 1 Query für das holen aller Projekte # + jeweils 1 Query für jedes Projekt, dem # Tasks zugeordnet sind!
    17. 17. N + 1 Problem @project = Project.all(:include => [:task] ) @project.each do |p| puts p.tasks.collect {|t| t.title} end # Anzahl der Queries: # 1 Query für das holen aller Projekte # 1 Query für alle Tasks
    18. 18. Dynamische Finder ActiveRecord erkennt besondere Finder am Funktionsnamen: • nd_by_title • nd_all_by_project_id_and_completed
    19. 19. Dynamische Finder Project.find_by_title 'Rails Workshop' Task.find_all_by_project_id_and_completed 1, true
    20. 20. ActiveRecord Finder Named Scopes Validierung Berechnungen
    21. 21. Named Scopes De nieren gekapselte Abfragebedingungen, die häu g verwendet werden.
    22. 22. Named Scopes class Task < ActiveRecord::Base named_scope :completed, :conditions => ['completed = ?', true] named_scope :open, :conditions => ['completed = ?', false] named_scope :high_prio, :conditions => {:priority => quot;highquot;} end Task.completed # liefert alle abgeschlossenen Tasks Task.open # liefert alle offenen Tasks Task.open.high_prio # liefert alle offenen Tasks mit hoher Priorität
    23. 23. Default Scope class Task < ActiveRecord::Base default_scope :order => 'completed DESC, title' end Task.all # liefert alle Projekte entsprechend sortiert
    24. 24. Named Scopes Vorsicht bei dynamischen Abfragebedingungen, da diese gecached werden! Näheres siehe Dokumentation zu ActiveRecord::NamedScope::ClassMethods
    25. 25. ActiveRecord Finder Named Scopes Validierung Berechnungen
    26. 26. Eingabevalidierung
    27. 27. Eingabevalidierung class Project < ActiveRecord::Base validates_presence_of :title end
    28. 28. Vorde nierte Validierungen validates_acceptance_of Feld • prüft, ob ein bestimmtes Feld gesetzt wurde Beispiel: Zustimmung zu den AGBs
    29. 29. Vorde nierte Validierungen validates_associated Model • führt die Validierungen eines verknüpften Modells (etwa has_many :tasks) mit aus
    30. 30. Vorde nierte Validierungen validates_con rmation_of Feld • benötigt ein zusätzliches Feld mit der Bezeichnung Feldname_con rmation • prüft, ob ein Feld wiederholt korrekt eingegeben wurde Beispiel: Passwortwiederholung
    31. 31. Vorde nierte Validierungen validates_exclusion_of Feld, :in => Array • der Wert darf nicht im de nierten Array vorkommt Beispiel: Nutzer kann Subdomain bekommen und darf bestimmte Varianten, wie www, imap oder smtp nicht wählen
    32. 32. Vorde nierte Validierungen validates_format_of Feld, :with => Regexp • prüft, ob der Wert die Anforderungen der Regular Expression erfüllt Beispiel: Validierung von E-Mail-Adressen
    33. 33. Vorde nierte Validierungen validates_inclusion_of Feld, :in => Array • der Wert muss in einem de nierten Array vorkommen Beispiel: Priorität einer Aufgabe kann nur bestimmte Werte annehmen
    34. 34. Vorde nierte Validierungen validates_length_of Feld, Optionen • prüft die Länge eines Wertes Optionen: • :maximum => Integer • :minimum => Integer • :in => Range (etwa 6..10) • :is => Integer
    35. 35. Vorde nierte Validierungen validates_numericality_of Feld, Optionen • prüft, ob es sich bei dem Wert um eine Zahl handelt • prüft die Grenzen des Zahlenwertes Optionen: • siehe Dokumentation
    36. 36. Vorde nierte Validierungen validates_presence_of Feld • prüft, ob das Feld gefüllt wurde Beispiel: • Projekte benötigen einen Titel
    37. 37. Vorde nierte Validierungen validates_uniqueness_of Feld • prüft, ob das Feld eindeutig ist, also nicht bereits in der Datenbank vorkommt Beispiel: • Der Titel eines Projektes muss eindeutig sein
    38. 38. ActiveRecord Finder Named Scopes Validierung Berechnungen
    39. 39. Berechnungen • count(Optionen) • average(Spalte, Optionen) • minimum(Spalte, Optionen) • maximum(Spalte, Optionen) • sum(Spalte, Optionen)
    40. 40. Berechnungen Project.count # liefert Anzahl der Projekte Project.count(:conditions => {:completed => false}) # liefert Anzahl der Projekte, die abgeschlossen sind Project.maximum(quot;durationquot;) Project.minimum(quot;durationquot;) Project.average(quot;durationquot;) Project.sum(quot;durationquot;) # liefern die maximale, minimale, durchschnittliche # oder gesamte Dauer der Projekte
    41. 41. Routing & REST
    42. 42. MVC Rails
    43. 43. MVC Rails
    44. 44. Routing Aufgaben des Routings: • Eine HTTP-Anfrage an eine URL in den Aufruf einer Methode in einem Controller verwandeln • URLs aus de nierten Parametern generieren, damit dies nicht von Hand erfolgen muss
    45. 45. con g/routes.rb • Enthält die De nition der Routen • Wird von oben nach unten abgearbeitet -> erste zutreffende Route wird verwendet und weitere Routen werden nicht mehr betrachtet
    46. 46. Standard Routen map.connect ':controller/:action/:id' URL: /projects/show/1 map.connect ':controller/:action/:id.:format' URL: /projects/show/1.xml
    47. 47. Leere Route map.root :controller => 'projects' URL: /
    48. 48. Leere Route map.root :controller => 'projects' URL: /
    49. 49. Reguläre Routen map.connect 's/:action', :controller => 'static' URL: /s/imprint Weitere Optionen siehe API
    50. 50. Benannte Routen map.imprint 'imprint', :controller => 'static', :action => 'imprint' URL: /imprint GENERATOREN: imprint_path, imprint_url Weitere Optionen siehe API
    51. 51. REST Representational State Transfer Grundprinzipien • URL als Identi kator einer Resource • HTTP-Methode als Aktion
    52. 52. Verwendete HTTP-Methoden GET - Bestehende Resource zurückgeben POST - Neue Resource erstellen PUT - Bestehende Resource ändern DELETE - Bestehenden Resource löschen
    53. 53. RESTful Routes map.resources :projects
    54. 54. RESTful Routes
    55. 55. RESTful Routes GET /projects - Projektliste liefern
    56. 56. RESTful Routes GET /projects - Projektliste liefern GET /projects/1 - Projekt mit der ID 1 liefern
    57. 57. RESTful Routes GET /projects - Projektliste liefern GET /projects/1 - Projekt mit der ID 1 liefern GET /projects/new - Formular für neues Projekt
    58. 58. RESTful Routes GET /projects - Projektliste liefern GET /projects/1 - Projekt mit der ID 1 liefern GET /projects/new - Formular für neues Projekt POST /projects - Neues Projekt erstellen
    59. 59. RESTful Routes GET /projects - Projektliste liefern GET /projects/1 - Projekt mit der ID 1 liefern GET /projects/new - Formular für neues Projekt POST /projects - Neues Projekt erstellen GET /projects/1/edit - Formular zum Bearbeiten
    60. 60. RESTful Routes GET /projects - Projektliste liefern GET /projects/1 - Projekt mit der ID 1 liefern GET /projects/new - Formular für neues Projekt POST /projects - Neues Projekt erstellen GET /projects/1/edit - Formular zum Bearbeiten PUT /projects/1 - Ändern des Projektes
    61. 61. RESTful Routes GET /projects - Projektliste liefern GET /projects/1 - Projekt mit der ID 1 liefern GET /projects/new - Formular für neues Projekt POST /projects - Neues Projekt erstellen GET /projects/1/edit - Formular zum Bearbeiten PUT /projects/1 - Ändern des Projektes DELETE /projects/1 - Löschen des Projektes
    62. 62. RESTful Routes GET /projects - projects_path GET /projects/1 - project_path(1) GET /projects/new - new_project_path POST /projects - projects_path GET /projects/1/edit - edit_project_path(1) PUT /projects/1 - project_path(1) DELETE /projects/1 - project_path(1)
    63. 63. Nested Routes map.resources :projects do |project| project.resources :tasks end project_tasks_path(1) URL: /projects/1/tasks project_task_path(1,1) URL: /projects/1/tasks/1
    64. 64. Formate respond_to do |format| format.html # return the default template for HTML format.xml { render :xml => @project.to_xml } end
    65. 65. convention over con guration
    66. 66. ?

    ×