Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Ruby on Rails SS09 08

642 views

Published on

Published in: Technology
  • Be the first to comment

  • Be the first to like this

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. ?

×