of 92 /92
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 - 2. Rails Introduction

Embed Size (px)

DESCRIPTION

A 180 min introduction on Ruby on Rails programming with hands-on exercises by Christian Feser, Michael Kram, Jakob Schröter and Marc Seeger Contents: Ruby On Rails Framework MVC Pattern Sample Project: OnlineShop Associations Migrations Views ERB-Templates Layouts/Partials Helper Controller Webservices Validators

Text of Ruby On Rails - 2. Rails Introduction

  • 1. Ruby on Rails Web Development that doesnt 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 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger agenda Ruby on Rails?! Projekt: OnlineShop Datenmodell Views Controller Diskussion
  • 3. Grundlagen
  • 4. 4 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Einordnung Java Ruby PHP Rails CakePHP Spring Merb Symfony Struts Sinatra Zend
  • 5. 5 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Entwicklung David Heinemeier Hansson Version 1.0: 2005 Version 2.0: 2007 Aktuell Version: 2.2.2
  • 6. 6 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Referenzprojekte http://rails100.pbwiki.com/
  • 7. 7 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger MVC - Paradigma Model View Controller Active Action Action Record View Controller
  • 8. 8 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger MVC - Paradigma http://wiki.rubyonrails.org/rails/pages/UnderstandingRailsMVC
  • 9. 9 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Konvention statt Konfiguration Ordner- struktur Namens- gebung
  • 10. 10 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Konvention statt Konfiguration models/order.rb views/orders/index.html.erb controllers/orders_controller.rb Tabelle: orders
  • 11. 11 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger DRY-Prinzip Dont Repeat Yourself Dont Repeat Yourself Dont Repeat Yourself Dont Repeat Yourself Dont Repeat Yourself
  • 12. Rails installieren
  • 13. 13 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Installation - Manuell 1 Ruby installieren 2 RubyGems installieren 3 Rails installieren gem install rails http://www.rubyonrails.org/down
  • 14. 14 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Installation One-Click 1 InstantRails installieren http://instantrails.rubyforge.org
  • 15. 15 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Entwicklungsumgebung TextMate Aptana RadRails (stand-alone/eclipse plugin) NetBeans
  • 16. Startschuss Projekt: OnlineShop
  • 17. 17 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Lokales Entwicklungssystem InstantRails NetBeans IDE Firefox Extensions SQLite Manager und Firebug Verknpfung zu Rails API Docs Verknpfung zu InstantRails Verzeichnis
  • 18. 18 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Neues Rails-Projekt anlegen 1. Entwicklungsumgebung NetBeans starten 2. Im Men File > New Project 3. Ruby on Rails Application auswhlen 4. Projektname OnlineShop vergeben 5. Database Adapter sqlite3 auswhlen (kein Username, Password) 6. Rails Version 2.2.2 whlen
  • 19. 19 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Angelegte Verzeichnisstruktur app/ controller/ helpers/ models/ views/ config/ db/ public/ images javascripts stylesheets
  • 20. 20 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Umgebungseinstellungen Entwicklungsumgebung (development) Ausfhrliche Fehlermeldungen, Caching deaktiviert, ignoriert E-Mail-Versand Produktionsumgebung (production) Allgemeine Fehlermeldungen, Caching aktiviert Testumgebung (test) zum Ausfhren von Testklassen, ausfhrliche Fehlermeldungen, Caching deaktiviert
  • 21. 21 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Namenskonventionen variables_in_lower_case :symbol (nur ein Verweis auf einen String) ClassName ModuleName tables_names (im Plural) Englische Bezeichnungen
  • 22. 22 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Generatoren script/generate controller (Controller, Views, Helper) migration (Migration-Datei fr DB Update) model (Migration-Datei fr Tabellenerstellung) resource (leeres Model, leerer Controller) scaffold (Model, Migration, Controller + Actions, Views) script/destroy
  • 23. Anwendungs-Anforderungen Projekt: OnlineShop
  • 24. 24 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Anwendungs-Anforderungen Shop bentigt: People Items Orders
  • 25. 25 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Grundgerst einrichten 1. Rechtsklick auf das Projekt > Generate 2. Auswahl scaffold 3. Modelname (im Singular) eingeben und Angabe der Attribute mit field:type Types: string, text, integer, float, decimal, datetime, timestamp, time, date, binary, boolean a) person - firstname:string lastname:string age:integer b) item - name:string price:decimal c) order - person_id:integer 4. Rechtsklick auf Projekt > Migrate Database > To Current Version
  • 26. 26 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Wooow, es luft! 1. Rechtsklick Project > Run 2. Im Browser aufrufen 1. http://localhost:3000/people 2. http://localhost:3000/items 3. Mehreren Personen und Items anlegen 4. Im Browser aufrufen 1. http://localhost:3000/orders 5. Im Firefox-Men auf Extras > SQLite Manager berprfen welche Tabellen automatisch angelegt wurden ->V1
  • 27. 27 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Assoziation 1:n n 1 Person Order Person bentigt einen Primrschlssel und has_many :orders Deklaration Order bentigt einen Fremdschlssel person_id und belongs_to :person Deklaration
  • 28. 28 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Assoziation 1:n - Methoden n 1 Person Order orders person orders false do |t| t.integer :item_id t.integer :order_id end 4. In der Migrationsdatei nun unter self.down drop_table :items_orders
  • 35. 35 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Ausfhren der Migration 1. Rechtsklick auf Projekt > Migrate Database > To Current Version 2. Neustart des Servers nach Datenbanknderung 3. Im Firefox-Men auf Extras > SQLite Manager berprfen welche Tabellen automatisch angelegt wurden
  • 36. 36 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Rails Console Zum Testen der Anwendung Alle Methoden, Klassen und Objekte der Anwendung sind verfgbar
  • 37. 37 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger People/Items anzeigen 1. Rechtsklick Projekt > Rails Console 2. Ermitteln der Anzahl der Item-Objekte Item.count 3. Ausgabe eines Item-Objekts mit Methode find Item.find(1) Item.find(1,2) Item.find(:all) Item.find(:all, :conditions => quot;name = 'XYZ' quot;) Item.find(:all, :order => quot;created_at DESCquot;) Item.find_by_name, Item.find_by_price
  • 38. 38 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Order erstellen 1. Ermitteln der Anzahl der Order-Objekte Order.count 2. Erstellen einer Order und zwischenspeichern order = Order.new order.person = Person.find(1) order.items SQLite Manager ffnen berprfen welche Eintrge in Tabelle items_orders angelegt wurden ->V2
  • 41. 41 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Wissenskasten Generatoren Model Assoziationen Console Migrations
  • 42. View Benutzerschnittstelle
  • 43. 43 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger
  • 44. 44 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Wie funktionieren Views in Rails http://wiki.rubyonrails.org/rails/pages/UnderstandingRailsMVC
  • 45. 45 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Ordnerstruktur
  • 46. 46 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger ERB-Templates Ruby-Code wird innerhalb dieser Tags ausgewertet Code wird ausgewertet und das Resultat als String ausgegeben Code wird ausgewertet, jedoch nichts ausgegeben (kein Zeilenumbruch) Auskommentierter Ruby-Code
  • 47. 47 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger form_for(@objekt) do |f| Werden Objekte bergeben die im Controller gefllt werden. Einzeilige Textfelder Weitere: f.password_field Mehrzeilige Textfelder f.check_box f.radio_button Button f.file_field f.hidden_field Beschriftung (Label)
  • 48. 48 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger form_for(@order) do |f| Select HTML-Ausgabe: Hans WurstGabi SchnabelHelga Wacken
  • 49. 49 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger DropDown-Feld fr Person in Orderform anlegen 1. ffnen von Views/orders/new.html.erb 2. Ersetzen des text_fields der person_id durch einen select-Feld: 3. Ergebnis prfen: http://localhost:3000/orders/new 4. Erweiterung im Template durchfhren: V2->
  • 50. 50 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Items-Auswahl in Orderform anlegen 1. Einfgen eines Mehrfach-Auswahlfeldes:


    true, :name => 'order[item_ids][]' %>

    2. Ergebnis prfen: http://localhost:3000/orders/new
  • 51. 51 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Items in Order-Template show ausgeben ffnen von Views/orders/show.html.erb Hinzufgen von Person-Feldern Hinzufgen von Item-Feldern
    ->V3
  • 52. 52 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Wissenskasten Generatoren Views ERB-Templates Model Assoziationen Console Forms Migrations Abhngigkeiten
  • 53. 53 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger
  • 54. 54 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger
  • 55. Layouts/Partials Dont repeat yourself
  • 56. 56 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Partials Auslagern/Wiederverwenden von Code in Templates Namenskonvention: _form.html.erb Aufruf mit quot;formquot; %> new.html.erb edit.html.erb _form.html.erb render: render: partial partial
  • 57. 57 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Parameterbergabe an Partials quot;formquot;, :locals => {:submit_text => quot;Changequot;} %> edit.html.erb _form.html.erb render: partial
  • 58. 58 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Partial fr Order new/edit 1. Erstellen der Datei _form.html.erb im Verzeichnis /views/orders 2. Formularcode aus new.html.erb in _form.html.erb kopieren 3. Variable submit_text statt der Buttonbeschriftung Create einsetzen 4. Im New/Edit Template quot;formquot;, :locals => {:submit_text => quot;Buttontextquot;} %> V3 ->
  • 59. 59 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Layout Konventionen Layoutrahmen fr gesamte Seite bzw. Seitengruppen Beinhaltet HTML controller1/edit Grundgerst controlle r3/index
  • 60. 60 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Layout Aufbau
  • 61. 61 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Standard Helper Auswahl: fr Verlinkung Entfernung von HTML Code link_to sanitize button_to html_escape (
  • 64. 64 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Layout mit Helper anlegen 1. ffnen von views/layout/orders.html.erb 2. Einfgen der Navigationslinks: | | 3. Ergebnis prfen: http://localhost:3000/orders http://localhost:3000/people http://localhost:3000/items 4. Umbenennen der orders.html.erb in application.html.erb und lschen der anderen Layoutdateien
  • 65. 65 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Whrungsformatierung des Item-Preises 1. ffnen views/items/index.html.erb 2. Preisausgabe verndern ' ', :separator => ',', :delimiter => '.') %> ->V4
  • 66. 66 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Wissenskasten Generatoren Views Businesslogik Helper ERB-Templates Model Assoziationen Console Validatoren Forms Routing REST Migrations Partial Layout Controller Webservices Abhngigkeiten
  • 67. Controller
  • 68. 68 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Wie funktionieren Controller in Rails http://wiki.rubyonrails.org/rails/pages/UnderstandingRailsMVC
  • 69. 69 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Vererbung ActionController::Base ApplicationController OrdersController PeopleController ItemsController
  • 70. 70 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Routing http://localhost:3000/orders/edit/1 URL map.connect controller/:action/:id routes.rb class OrdersController < ApplicationController def index end def edit Controller @order = Order.find(params[:id]) end end View .
  • 71. 71 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Anfragen empfangen/weiterleiten OrdersController show new edit create update destroy index index.html.erb show.html.erb new.html.erb edit.html.erb ( render bzw. redirect_to )
  • 72. 72 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Controller einrichten 1. Anschauen, was bereits wie funktioniert 2. Fertig ;-)
  • 73. Businesslogik im Controller?
  • 74. 74 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Businesslogik: im Model! 1. ffne Models/order.rb 2. Methode definieren: 12 def total_price items.sum(:price) end 3. ffne Views/orders/show.html.erb Total Price: V4->
  • 75. Webservices
  • 76. 76 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger RESTful Ansatz RESTful HTTP-Anfrage: HTTP-Methode Ressource (URL) HTTP GET URL Fordert die Ressource an POST URL Legt eine neue Ressource an PUT URL ndert die angegebene Ressource DELETE URL Lscht die angegebene Ressource
  • 77. 77 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Beispiel REST-Anfrage GET http://localhost:3000/people/1 POST http://localhost:3000/people PUT http://localhost:3000/people/3 DELETE http://localhost:3000/people/2 Demo im Client
  • 78. 78 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger RESTful Rails
  • 79. 79 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Setzen und Abfragen von Cookies Beispielcode: Cookies[:user_id] = { :value => 8 :expires => 2.hours.form_now} Optionen: value, path, domain, expires, secure, http_only V4->
  • 80. 80 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Setzen und Abfragen von Sessions Session ist standardmig immer aktiviert Beispielcode: session[:user_id] = user.id Session-Management kann fr einzelne Controller deaktiviert werden Class InfoController < ApplicationController session :off end
  • 81. 81 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Wissenskasten Generatoren Views Businesslogik Helper ERB-Templates Model Assoziationen Console Validatoren Forms Routing REST Migrations Partial Layout Controller Webservices Abhngigkeiten
  • 82. Zugabe weil Rails Spa macht. Oder?
  • 83. 83 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Validatoren
  • 84. 84 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Validatoren validates_acceptance_of validates_associated validates_confirmation_of validates_exclusion_of validates_inclusion_of ActiveRecord::Base validates_format_of validates_length_of Person Item Order validates_size_of validates_numericality_of validates_presence_of validates_uniqueness_of validates_each
  • 85. 85 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Validatoren fr Person anlegen 1. ffnen Models/person.rb 2. Eintragen der Validatoren validates_presence_of :firstname, :lastname validates_numericality_of :age, :greater_than => 17, :only_integer => true 3. Testen der Validierung im View http://localhost:3000/people 4. Testen der Validierung ber Console p1 = Person.find(1) p1.age = 3 p1.save V4->
  • 86. 86 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Abhngigkeiten Item Item Person Order Item Knnen im Model mit den Assoziationen definiert werden. :dependent => :nullify (Standard) :dependent => :destroy :delete_all
  • 87. 87 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Abhngigkeiten 1. ffnen Models/person.rb 2. Eintragen der Abhngigkeit has_many :orders, :dependent => :destroy 3. Testen der Abhngigkeit Durch Lschen einer Person http://localhost:3000/people berprfung der Verknpfungstabelle im SQLite Manager in Firefox
  • 88. 88 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Wissenskasten Generatoren Views Businesslogik Helper ERB-Templates Model Assoziationen Console Validatoren Forms Routing REST Migrations Partial Layout Controller Webservices Abhngigkeiten
  • 89. 89 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Wissenskasten Generatoren Views Businesslogik Helper ERB-Templates Model Assoziationen Console Validatoren Forms Routing REST Migrations Partial Layout Controller Webservices Abhngigkeiten
  • 90. 90 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Diskussion
  • 91. 91 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Unsere Meinung ->V5
  • 92. 92 Christian Feser, Michael Kram, Jakob Schrter, Marc Seeger Quellen Morsy, Hussein; Otto, Tanja: Ruby on Rails 2 Das Entwickler-Handbuch (2008): Galileo Press Fischer, Jens-Christian: Professionelle Webentwicklung mit Ruby on Rails 2 (2008): mitp Marinschek, Martin; Radinger, Wolfgang; Ruby on Rails: Einstieg in die effiziente Webentwicklung (2006): Dpunkt Verlag Wartala, Ramon; Krutisch, Jan: Webanwendungen mit Ruby on Rails (2007): Addision-Wesley Verlag Orsini, Rob: Rails Kochbuch (2007): OReilly Verlag http://api.rubyonrails.org/ bungsbild: http://rubyonrailsprogrammingguide.com/basics/why-ruby-on- rails-part-2/