SlideShare uma empresa Scribd logo
1 de 92
Baixar para ler offline
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
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 agenda
   • Ruby on Rails?!
   • Projekt: OnlineShop
        ▫ Datenmodell
        ▫ Views
        ▫ Controller
   • Diskussion
Grundlagen
4
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Einordnung


        Java                                        Ruby            PHP
                                                         Rails      CakePHP
          Spring
                                                             Merb   Symfony
           Struts
                                                       Sinatra       Zend
                  …                                           …       …
5
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Entwicklung
   • David Heinemeier Hansson

   • Version 1.0: 2005
   • Version 2.0: 2007
   • Aktuell Version: 2.2.2
6
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Referenzprojekte




                                                             http://rails100.pbwiki.com/
7
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 MVC - Paradigma

         Model                                               View     Controller


           Active                                            Action     Action
           Record                                             View     Controller
8
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 MVC - Paradigma




                                                        http://wiki.rubyonrails.org/rails/pages/UnderstandingRailsMVC
9
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Konvention statt Konfiguration


                                      Ordner-
                                      struktur

                                                             Namens-
                                                              gebung
10
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Konvention statt Konfiguration
  • models/order.rb

  • views/orders/index.html.erb

  • controllers/orders_controller.rb

  • Tabelle: orders
11
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 DRY-Prinzip
                                 Don‘t Repeat Yourself

                                 Don‘t Repeat Yourself

                                 Don‘t Repeat Yourself

                                 Don‘t Repeat Yourself

                                 Don‘t Repeat Yourself
Rails installieren
13
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Installation - Manuell


                               1           • Ruby installieren


                              2            • RubyGems installieren


                              3            • Rails installieren
                                             „gem install rails“


                                                             http://www.rubyonrails.org/down
14
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Installation – One-Click


                               1           • InstantRails installieren




                                                             http://instantrails.rubyforge.org
15
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Entwicklungsumgebung
   • TextMate


   • Aptana RadRails
     (stand-alone/eclipse plugin)

   • NetBeans
Startschuss
Projekt: OnlineShop
17
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Lokales Entwicklungssystem
   • InstantRails
   • NetBeans IDE
   • Firefox Extensions „SQLite Manager“
     und „Firebug“

   • Verknüpfung zu Rails API Docs
   • Verknüpfung zu InstantRails Verzeichnis
18
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Neues Rails-Projekt anlegen

   1. Entwicklungsumgebung NetBeans starten
   2. Im Menü File > New Project
   3. „Ruby on Rails Application“ auswählen
   4. Projektname „OnlineShop“ vergeben
   5. Database Adapter „sqlite3“ auswählen (kein
      Username, Password)
   6. Rails Version 2.2.2 wählen
19
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Angelegte Verzeichnisstruktur
   • app/
        ▫   controller/
        ▫   helpers/
        ▫   models/
        ▫   views/
   • config/
   • db/
   • public/
        ▫ images
        ▫ javascripts
        ▫ stylesheets
   •…
20
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Umgebungseinstellungen
   • Entwicklungsumgebung (development)
        ▫ Ausführliche Fehlermeldungen, Caching
          deaktiviert, ignoriert E-Mail-Versand
   • Produktionsumgebung (production)
        ▫ Allgemeine Fehlermeldungen, Caching aktiviert
   • Testumgebung (test)
        ▫ zum Ausführen von Testklassen, ausführliche
          Fehlermeldungen, Caching deaktiviert
21
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Namenskonventionen
   •   variables_in_lower_case
   •   :symbol (nur ein Verweis auf einen String)
   •   ClassName
   •   ModuleName
   •   tables_names (im Plural)

   • Englische Bezeichnungen
22
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Generatoren
   script/generate…
    …controller (Controller, Views, Helper)
    …migration (Migration-Datei für DB Update)
    …model (Migration-Datei für Tabellenerstellung)
    …resource (leeres Model, leerer Controller)
    …scaffold (Model, Migration, Controller +
     Actions, Views)

   script/destroy…
Anwendungs-Anforderungen
Projekt: OnlineShop
24
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Anwendungs-Anforderungen
   Shop benötigt:

                                                 People

                                                   Items

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




 Grundgerüst 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
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Wooow, es läuft!
   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
        ▫       Überprüfen welche Tabellen automatisch
                angelegt wurden
                                                             ->V1
27
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Assoziation 1:n
                                                             n
                                           1
                  Person                                         Order



   • Person benötigt einen Primärschlüssel und
     has_many :orders Deklaration
   • Order benötigt einen Fremdschlüssel person_id
     und belongs_to :person Deklaration
28
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Assoziation 1:n - Methoden
                                                             n
                                           1
                  Person                                              Order


   •   orders                                                •   person
   •   orders <<                                             •   person=
   •   orders.create                                         •   build_person
   •   orders.build                                          •   create_person
   •   orders=                                               •   person.nil?
   •   orders.find
   •   orders.size
   •   orders.emtpy?
   •   orders.delete
29
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Assoziation n:m
                                                             m
                                           n
                   Order                                         Item



   • Order benötigt einen Primärschlüssel und
     has_and_belongs_to_many :items
     Deklaration
   • Item benötigt einen Primärschlüssel und
     has_and_belongs_to_many :orders
     Deklaration
30
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Assoziation n:m - Methoden
                                                             m
                                           n
                   Order                                              Item


   •   items                                                 •   orders
   •   items <<                                              •   orders <<
   •   items.create                                          •   orders.create
   •   items.build                                           •   orders.build
   •   items =                                               •   orders=
   •   items.find                                            •   orders.find
   •   items.size                                            •   orders.size
   •   items.emtpy?                                          •   orders.emtpy?
   •   items.delete                                          •   orders.delete
31
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Assoziation n:m - Verknüpfungstabelle

                                                             m
                                           n
                   Order                                         Item



   • Tabelle mit Fremdschlüsseln:
        ▫ item_id
        ▫ order_id
   • Name der Verknüpfungstabelle (alphabetisch!):
        ▫ items_orders
32
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Assoziationen
 person <> order

   Beziehung zwischen person <> order modellieren

   1. In NetBeans das Model für „person“ öffnen
            has_many :orders

   2. In NetBeans das Model für „order“ öffnen
            belongs_to :person



                                                             V1->
33
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Assoziationen
 order <> item

   Beziehung zwischen order <> item modellieren

   1. In NetBeans das Model für „order“ öffnen
            has_and_belongs_to_many :items

   2. In NetBeans das Model für „item“ öffnen
            has_and_belongs_to_many :orders
34
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Anlegen der Migration für
 die Verknüpfungstabelle
   1. Rechtsklick Projekt > Generate
   2. Migration Generator auswählen
        ▫ Arguments: CreateJoinItemsOrders
   3. In der Migrationsdatei nun unter self.up
             create_table :items_orders, :id => 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
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Ausführen der Migration

   1. Rechtsklick auf Projekt > Migrate Database >
      To Current Version
   2. Neustart des Servers nach Datenbankänderung
   3. Im Firefox-Menü auf Extras > SQLite Manager
        ▫       Überprüfen welche Tabellen automatisch
                angelegt wurden
36
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Rails Console
   • Zum Testen der Anwendung
   • Alle Methoden, Klassen und Objekte der
     Anwendung sind verfügbar
37
Christian Feser, Michael Kram, Jakob Schröter, 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
Christian Feser, Michael Kram, Jakob Schröter, 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 << Item.find(1, 3)
   3. Anzeigen der Order
             order
   4. Anzeigen der zugeordneten Items
             order.items
   5. Speichern in Datenbank
             order.save
39
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Person bearbeiten
   • Namen der Person austauschen
             person = Person.find(1)
             person.firstname = quot;NeuerNamequot;
             person.save

             person.update_attribute(:firstname,
              quot;NeuerNamequot;)
40
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Überprüfung der
 Zuweisungen

   1. Im Firefox-Menü auf Extras >
      SQLite Manager öffnen
        ▫       Überprüfen welche Einträge in Tabelle
                items_orders angelegt wurden




                                                             ->V2
41
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Wissenskasten
                   Generatoren



                                                   Model     Assoziationen



                       Console



                                               Migrations
View
Benutzerschnittstelle
43
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
44
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Wie funktionieren Views in Rails




                                                        http://wiki.rubyonrails.org/rails/pages/UnderstandingRailsMVC
45
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




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




 ERB-Templates
   • <% Ruby-Code %>
        ▫ Ruby-Code wird innerhalb dieser Tags
          ausgewertet
   • <%= Ruby-Code %>
        ▫ Code wird ausgewertet und das Resultat als String
          ausgegeben
   • <%- Ruby-Code %>
        ▫ Code wird ausgewertet, jedoch nichts ausgegeben
          (kein Zeilenumbruch)
   • <%# Ruby-Code %>
        ▫ Auskommentierter Ruby-Code
47
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 form_for(@objekt) do |f|
   • Werden Objekte übergeben die im
     Controller gefüllt werden.

   • Einzeilige Textfelder                                   • Weitere:
        <%= f.text_field :firstname %>                         f.password_field
   • Mehrzeilige Textfelder                                    f.check_box
        <%= f.text_area :firstname %>                          f.radio_button
   • Button                                                    f.file_field
        <%= f.submit quot;Submitquot; %>                               f.hidden_field
   • Beschriftung (Label)
        <%= f.label :firstname %>
48
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 form_for(@order) do |f|
   • Select
             <%= f.select :person_id,
              Person.find(:all).collect {|p|
              [p.firstname+quot; quot;+p.lastname, p.id]} %>


   • HTML-Ausgabe:
             <select id=quot;order_person_idquot;
              name=quot;order[person_id]quot;>
              <option value=quot;1quot;>Hans Wurst</option>
              <option value=quot;2quot;>Gabi Schnabel</option>
              <option value=quot;5quot;>Helga Wacken</option>
             </select>
49
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 DropDown-Feld für Person in
 Orderform anlegen

   1. Öffnen von Views/orders/new.html.erb
   2. Ersetzen des text_fields der person_id durch
      einen select-Feld:
             <%= f.select :person_id, Person.find(:all) %>
   3. Ergebnis prüfen:
      http://localhost:3000/orders/new
   4. Erweiterung im Template durchführen:
             <%= f.select :person_id,
              Person.find(:all).collect {|p|
              [p.firstname+quot; quot;+p.lastname, p.id]} %>
                                                             V2->
50
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Items-Auswahl in Orderform
 anlegen

   1. Einfügen eines Mehrfach-Auswahlfeldes:
               <p>
                    <%= f.label :item_ids, 'Items'%> <br />
                    <%= f.collection_select :item_ids,
                        Item.find(:all), :id, :name, {},
                        :multiple => true,
                        :name => 'order[item_ids][]' %>
                  </p>
   2. Ergebnis prüfen:
      http://localhost:3000/orders/new
51
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Items in Order-Template
 „show“ ausgeben
• Öffnen von Views/orders/show.html.erb
• Hinzufügen von Person-Feldern
             <%=h @order.person.firstname %>
             <%=h @order.person.lastname %>
• Hinzufügen von Item-Feldern
          <%for item in @order.items %>
           <%=h item.name %> <%=h item.price %><br />
          <%end%>



                                                             ->V3
52
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Wissenskasten
                    Generatoren                     Views




                  ERB-Templates                    Model             Assoziationen




                        Console                              Forms




                                                Migrations




                                                                     Abhängigkeiten
53
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
54
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
Layouts/Partials
Don‘t repeat yourself…
56
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Partials
   • Auslagern/Wiederverwenden von Code
     in Templates
   • Namenskonvention: _form.html.erb
   • Aufruf mit <% render :partial => quot;formquot; %>

        new.html.erb                                                edit.html.erb
                                                   _form.html.erb

            render:                                                   render:
            partial                                                   partial
57
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Parameterübergabe an Partials
        <%= render :partial => quot;formquot;,
       :locals => {:submit_text => quot;Changequot;} %>


                                                             edit.html.erb
                 _form.html.erb

                                                               render:
                                                               partial
58
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Partial für 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
                 <%= render :partial => quot;formquot;,
                :locals => {:submit_text =>
                quot;Buttontextquot;} %>
                                                             V3 ->
59
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Layout Konventionen
   • Layoutrahmen für
     gesamte Seite bzw.
     Seitengruppen
   • Beinhaltet HTML                                         controller1/edit
     Grundgerüst



                                                               controlle
                                                               r3/index
60
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Layout Aufbau
61
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Standard Helper Auswahl:
   • für Verlinkung                                          • Entfernung von HTML Code
        ▫   link_to                                             ▫   sanitize
        ▫   button_to                                           ▫   html_escape (<%=h…)
        ▫   mail_to                                             ▫   strip_links
        ▫   image_tag                                           ▫   strip_tags
   • für Einbinden von Stylesheets und                       • Sonstige Helper
     JavaScripts                                                ▫ cycle
        ▫ stylesheet_link_tag
        ▫ javascript_include_tag
   • Zahlenformatierung
        ▫   number_to_currency
        ▫   number_with_delimiter
        ▫   number_to_human_size
        ▫   number_to_percentage
   • Textmanipulation
        ▫   excerpt
        ▫   highlight
        ▫   truncat
        ▫   word_wrap
        ▫   pluralize
62
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Eigene Helper
63
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Übungen
   • Layout mit Helper anlegen
        ▫ Die einzelnen Layouts die in views/layout liegen durch ein
          Anwendungsweites Layout (application.html.erb) ersetzen.
        ▫ In dieses neue Layout eine einfache Navigationsleiste
          einfügen. Diese soll es ermöglichen in jedem View zu der
          Index-Seite von People, Orders, Items zu navigieren.
        ▫ Diese Verlinkung soll mithilfe des link_to-Helpers realisiert
          werden.
   • Währungsformatierung des Item-Preises
        ▫ Die Ausgaben des Preises in der Items-Liste soll mithilfe
          des number_to_currency Helpers realisiert werden.

    Infos siehe Rails API Docs (link auf Desktop)
    suchen nach link_to bzw. number_to_currency

                                                                      V3->
64
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Layout mit Helper anlegen
   1. Öffnen von views/layout/orders.html.erb
   2. Einfügen der Navigationslinks:
             <=% link_to quot;Peoplequot;, people_path %> |
             <=% link_to quot;Itemsquot;, items_path %> |
             <=% link_to quot;Ordersquot;, orders_path %>
   3. Ergebnis prüfen:
        ▫ http://localhost:3000/orders
        ▫ http://localhost:3000/people
        ▫ http://localhost:3000/items
   4. Umbenennen der orders.html.erb in
      application.html.erb und löschen der anderen
      Layoutdateien
65
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Währungsformatierung des
 Item-Preises
   1. Öffnen views/items/index.html.erb
   2. Preisausgabe verändern
             <%=h number_to_currency(item.price,
              :unit => '€ ',
              :separator => ',',
              :delimiter => '.') %>




                                                             ->V4
66
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
Controller
68
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Wie funktionieren Controller in Rails




                                                        http://wiki.rubyonrails.org/rails/pages/UnderstandingRailsMVC
69
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Vererbung

                                                   ActionController::Base




                                                   ApplicationController




                                                                            OrdersController
      PeopleController                                  ItemsController
70
Christian Feser, Michael Kram, Jakob Schröter, 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
                          …
                          <% form_for(@order) do |f| %>
   View                      ….
                          <%end>
71
Christian Feser, Michael Kram, Jakob Schröter, 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
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Controller einrichten

   1. Anschauen, was bereits wie funktioniert
   2. Fertig ;-)
Businesslogik
…im Controller?
74
Christian Feser, Michael Kram, Jakob Schröter, 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: <%= @order.total_price %>




                                                                  V4->
Webservices
76
Christian Feser, Michael Kram, Jakob Schröter, 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                                    Löscht die angegebene Ressource
77
Christian Feser, Michael Kram, Jakob Schröter, 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
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 RESTful Rails
79
Christian Feser, Michael Kram, Jakob Schröter, 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
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Setzen und Abfragen von Sessions
   • Session ist standardmäßig immer aktiviert

   • Beispielcode:
             session[:user_id] = user.id


   • Session-Management kann für einzelne
     Controller deaktiviert werden
             Class InfoController                            < ApplicationController
              session :off
             end
81
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
Zugabe
…weil Rails Spaß macht. Oder?
83
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Validatoren
84
Christian Feser, Michael Kram, Jakob Schröter, 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
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Validatoren für 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
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Abhängigkeiten                                                 Item



                                                                   Item
          Person                                        Order

                                                                       Item




   • Können im Model mit den Assoziationen
     definiert werden.
        ▫ :dependent => :nullify (Standard)
        ▫ :dependent => :destroy
        ▫ :delete_all
87
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




 Abhängigkeiten
   1. Öffnen Models/person.rb
   2. Eintragen der Abhängigkeit
             has_many :orders, :dependent => :destroy
   3. Testen der Abhängigkeit
        ▫ Durch Löschen einer Person
          http://localhost:3000/people
        ▫ Überprüfung der Verknüpfungstabelle im SQLite
          Manager in Firefox
88
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
89
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
90
Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger




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




 Unsere Meinung




                                                             ->V5
92
Christian Feser, Michael Kram, Jakob Schröter, 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): O‘Reilly Verlag

   • http://api.rubyonrails.org/
   Übungsbild: http://rubyonrailsprogrammingguide.com/basics/why-ruby-on-
     rails-part-2/

Mais conteúdo relacionado

Mais de Jakob

SDC2011: Web Performance Optimization
SDC2011: Web Performance OptimizationSDC2011: Web Performance Optimization
SDC2011: Web Performance OptimizationJakob
 
Automatisierung von Client-seitigen Web-Performance-Optimierungen
Automatisierung von Client-seitigen Web-Performance-OptimierungenAutomatisierung von Client-seitigen Web-Performance-Optimierungen
Automatisierung von Client-seitigen Web-Performance-OptimierungenJakob
 
Client-side Web Performance Optimization [paper]
Client-side Web Performance Optimization [paper]Client-side Web Performance Optimization [paper]
Client-side Web Performance Optimization [paper]Jakob
 
HTML5 Video vs. Flash Video [paper]
HTML5 Video vs. Flash Video [paper]HTML5 Video vs. Flash Video [paper]
HTML5 Video vs. Flash Video [paper]Jakob
 
Flash Video vs. HTML5 Video
Flash Video vs. HTML5 VideoFlash Video vs. HTML5 Video
Flash Video vs. HTML5 VideoJakob
 
Ruby On Rails - 1. Ruby Introduction
Ruby On Rails - 1. Ruby IntroductionRuby On Rails - 1. Ruby Introduction
Ruby On Rails - 1. Ruby IntroductionJakob
 

Mais de Jakob (6)

SDC2011: Web Performance Optimization
SDC2011: Web Performance OptimizationSDC2011: Web Performance Optimization
SDC2011: Web Performance Optimization
 
Automatisierung von Client-seitigen Web-Performance-Optimierungen
Automatisierung von Client-seitigen Web-Performance-OptimierungenAutomatisierung von Client-seitigen Web-Performance-Optimierungen
Automatisierung von Client-seitigen Web-Performance-Optimierungen
 
Client-side Web Performance Optimization [paper]
Client-side Web Performance Optimization [paper]Client-side Web Performance Optimization [paper]
Client-side Web Performance Optimization [paper]
 
HTML5 Video vs. Flash Video [paper]
HTML5 Video vs. Flash Video [paper]HTML5 Video vs. Flash Video [paper]
HTML5 Video vs. Flash Video [paper]
 
Flash Video vs. HTML5 Video
Flash Video vs. HTML5 VideoFlash Video vs. HTML5 Video
Flash Video vs. HTML5 Video
 
Ruby On Rails - 1. Ruby Introduction
Ruby On Rails - 1. Ruby IntroductionRuby On Rails - 1. Ruby Introduction
Ruby On Rails - 1. Ruby Introduction
 

Ruby On Rails - 2. Rails Introduction

  • 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 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger agenda • Ruby on Rails?! • Projekt: OnlineShop ▫ Datenmodell ▫ Views ▫ Controller • Diskussion
  • 4. 4 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Einordnung Java Ruby PHP Rails CakePHP Spring Merb Symfony Struts Sinatra Zend … … …
  • 5. 5 Christian Feser, Michael Kram, Jakob Schröter, 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 Schröter, Marc Seeger Referenzprojekte http://rails100.pbwiki.com/
  • 7. 7 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger MVC - Paradigma Model View Controller Active Action Action Record View Controller
  • 8. 8 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger MVC - Paradigma http://wiki.rubyonrails.org/rails/pages/UnderstandingRailsMVC
  • 9. 9 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Konvention statt Konfiguration Ordner- struktur Namens- gebung
  • 10. 10 Christian Feser, Michael Kram, Jakob Schröter, 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 Schröter, Marc Seeger DRY-Prinzip Don‘t Repeat Yourself Don‘t Repeat Yourself Don‘t Repeat Yourself Don‘t Repeat Yourself Don‘t Repeat Yourself
  • 13. 13 Christian Feser, Michael Kram, Jakob Schröter, 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 Schröter, Marc Seeger Installation – One-Click 1 • InstantRails installieren http://instantrails.rubyforge.org
  • 15. 15 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Entwicklungsumgebung • TextMate • Aptana RadRails (stand-alone/eclipse plugin) • NetBeans
  • 17. 17 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Lokales Entwicklungssystem • InstantRails • NetBeans IDE • Firefox Extensions „SQLite Manager“ und „Firebug“ • Verknüpfung zu Rails API Docs • Verknüpfung zu InstantRails Verzeichnis
  • 18. 18 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Neues Rails-Projekt anlegen 1. Entwicklungsumgebung NetBeans starten 2. Im Menü File > New Project 3. „Ruby on Rails Application“ auswählen 4. Projektname „OnlineShop“ vergeben 5. Database Adapter „sqlite3“ auswählen (kein Username, Password) 6. Rails Version 2.2.2 wählen
  • 19. 19 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Angelegte Verzeichnisstruktur • app/ ▫ controller/ ▫ helpers/ ▫ models/ ▫ views/ • config/ • db/ • public/ ▫ images ▫ javascripts ▫ stylesheets •…
  • 20. 20 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Umgebungseinstellungen • Entwicklungsumgebung (development) ▫ Ausführliche Fehlermeldungen, Caching deaktiviert, ignoriert E-Mail-Versand • Produktionsumgebung (production) ▫ Allgemeine Fehlermeldungen, Caching aktiviert • Testumgebung (test) ▫ zum Ausführen von Testklassen, ausführliche Fehlermeldungen, Caching deaktiviert
  • 21. 21 Christian Feser, Michael Kram, Jakob Schröter, 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 Schröter, Marc Seeger Generatoren script/generate… …controller (Controller, Views, Helper) …migration (Migration-Datei für DB Update) …model (Migration-Datei für Tabellenerstellung) …resource (leeres Model, leerer Controller) …scaffold (Model, Migration, Controller + Actions, Views) script/destroy…
  • 24. 24 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Anwendungs-Anforderungen Shop benötigt: People Items Orders
  • 25. 25 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Grundgerüst 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 Schröter, Marc Seeger Wooow, es läuft! 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 ▫ Überprüfen welche Tabellen automatisch angelegt wurden ->V1
  • 27. 27 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Assoziation 1:n n 1 Person Order • Person benötigt einen Primärschlüssel und has_many :orders Deklaration • Order benötigt einen Fremdschlüssel person_id und belongs_to :person Deklaration
  • 28. 28 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Assoziation 1:n - Methoden n 1 Person Order • orders • person • orders << • person= • orders.create • build_person • orders.build • create_person • orders= • person.nil? • orders.find • orders.size • orders.emtpy? • orders.delete
  • 29. 29 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Assoziation n:m m n Order Item • Order benötigt einen Primärschlüssel und has_and_belongs_to_many :items Deklaration • Item benötigt einen Primärschlüssel und has_and_belongs_to_many :orders Deklaration
  • 30. 30 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Assoziation n:m - Methoden m n Order Item • items • orders • items << • orders << • items.create • orders.create • items.build • orders.build • items = • orders= • items.find • orders.find • items.size • orders.size • items.emtpy? • orders.emtpy? • items.delete • orders.delete
  • 31. 31 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Assoziation n:m - Verknüpfungstabelle m n Order Item • Tabelle mit Fremdschlüsseln: ▫ item_id ▫ order_id • Name der Verknüpfungstabelle (alphabetisch!): ▫ items_orders
  • 32. 32 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Assoziationen person <> order Beziehung zwischen person <> order modellieren 1. In NetBeans das Model für „person“ öffnen has_many :orders 2. In NetBeans das Model für „order“ öffnen belongs_to :person V1->
  • 33. 33 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Assoziationen order <> item Beziehung zwischen order <> item modellieren 1. In NetBeans das Model für „order“ öffnen has_and_belongs_to_many :items 2. In NetBeans das Model für „item“ öffnen has_and_belongs_to_many :orders
  • 34. 34 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Anlegen der Migration für die Verknüpfungstabelle 1. Rechtsklick Projekt > Generate 2. Migration Generator auswählen ▫ Arguments: CreateJoinItemsOrders 3. In der Migrationsdatei nun unter self.up create_table :items_orders, :id => 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 Schröter, Marc Seeger Ausführen der Migration 1. Rechtsklick auf Projekt > Migrate Database > To Current Version 2. Neustart des Servers nach Datenbankänderung 3. Im Firefox-Menü auf Extras > SQLite Manager ▫ Überprüfen welche Tabellen automatisch angelegt wurden
  • 36. 36 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Rails Console • Zum Testen der Anwendung • Alle Methoden, Klassen und Objekte der Anwendung sind verfügbar
  • 37. 37 Christian Feser, Michael Kram, Jakob Schröter, 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 Schröter, 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 << Item.find(1, 3) 3. Anzeigen der Order order 4. Anzeigen der zugeordneten Items order.items 5. Speichern in Datenbank order.save
  • 39. 39 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Person bearbeiten • Namen der Person austauschen person = Person.find(1) person.firstname = quot;NeuerNamequot; person.save person.update_attribute(:firstname, quot;NeuerNamequot;)
  • 40. 40 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Überprüfung der Zuweisungen 1. Im Firefox-Menü auf Extras > SQLite Manager öffnen ▫ Überprüfen welche Einträge in Tabelle items_orders angelegt wurden ->V2
  • 41. 41 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Wissenskasten Generatoren Model Assoziationen Console Migrations
  • 43. 43 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
  • 44. 44 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Wie funktionieren Views in Rails http://wiki.rubyonrails.org/rails/pages/UnderstandingRailsMVC
  • 45. 45 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Ordnerstruktur
  • 46. 46 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger ERB-Templates • <% Ruby-Code %> ▫ Ruby-Code wird innerhalb dieser Tags ausgewertet • <%= Ruby-Code %> ▫ Code wird ausgewertet und das Resultat als String ausgegeben • <%- Ruby-Code %> ▫ Code wird ausgewertet, jedoch nichts ausgegeben (kein Zeilenumbruch) • <%# Ruby-Code %> ▫ Auskommentierter Ruby-Code
  • 47. 47 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger form_for(@objekt) do |f| • Werden Objekte übergeben die im Controller gefüllt werden. • Einzeilige Textfelder • Weitere: <%= f.text_field :firstname %> f.password_field • Mehrzeilige Textfelder f.check_box <%= f.text_area :firstname %> f.radio_button • Button f.file_field <%= f.submit quot;Submitquot; %> f.hidden_field • Beschriftung (Label) <%= f.label :firstname %>
  • 48. 48 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger form_for(@order) do |f| • Select <%= f.select :person_id, Person.find(:all).collect {|p| [p.firstname+quot; quot;+p.lastname, p.id]} %> • HTML-Ausgabe: <select id=quot;order_person_idquot; name=quot;order[person_id]quot;> <option value=quot;1quot;>Hans Wurst</option> <option value=quot;2quot;>Gabi Schnabel</option> <option value=quot;5quot;>Helga Wacken</option> </select>
  • 49. 49 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger DropDown-Feld für Person in Orderform anlegen 1. Öffnen von Views/orders/new.html.erb 2. Ersetzen des text_fields der person_id durch einen select-Feld: <%= f.select :person_id, Person.find(:all) %> 3. Ergebnis prüfen: http://localhost:3000/orders/new 4. Erweiterung im Template durchführen: <%= f.select :person_id, Person.find(:all).collect {|p| [p.firstname+quot; quot;+p.lastname, p.id]} %> V2->
  • 50. 50 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Items-Auswahl in Orderform anlegen 1. Einfügen eines Mehrfach-Auswahlfeldes: <p> <%= f.label :item_ids, 'Items'%> <br /> <%= f.collection_select :item_ids, Item.find(:all), :id, :name, {}, :multiple => true, :name => 'order[item_ids][]' %> </p> 2. Ergebnis prüfen: http://localhost:3000/orders/new
  • 51. 51 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Items in Order-Template „show“ ausgeben • Öffnen von Views/orders/show.html.erb • Hinzufügen von Person-Feldern <%=h @order.person.firstname %> <%=h @order.person.lastname %> • Hinzufügen von Item-Feldern <%for item in @order.items %> <%=h item.name %> <%=h item.price %><br /> <%end%> ->V3
  • 52. 52 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Wissenskasten Generatoren Views ERB-Templates Model Assoziationen Console Forms Migrations Abhängigkeiten
  • 53. 53 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
  • 54. 54 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger
  • 56. 56 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Partials • Auslagern/Wiederverwenden von Code in Templates • Namenskonvention: _form.html.erb • Aufruf mit <% render :partial => quot;formquot; %> new.html.erb edit.html.erb _form.html.erb render: render: partial partial
  • 57. 57 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Parameterübergabe an Partials <%= render :partial => quot;formquot;, :locals => {:submit_text => quot;Changequot;} %> edit.html.erb _form.html.erb render: partial
  • 58. 58 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Partial für 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 <%= render :partial => quot;formquot;, :locals => {:submit_text => quot;Buttontextquot;} %> V3 ->
  • 59. 59 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Layout Konventionen • Layoutrahmen für gesamte Seite bzw. Seitengruppen • Beinhaltet HTML controller1/edit Grundgerüst controlle r3/index
  • 60. 60 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Layout Aufbau
  • 61. 61 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Standard Helper Auswahl: • für Verlinkung • Entfernung von HTML Code ▫ link_to ▫ sanitize ▫ button_to ▫ html_escape (<%=h…) ▫ mail_to ▫ strip_links ▫ image_tag ▫ strip_tags • für Einbinden von Stylesheets und • Sonstige Helper JavaScripts ▫ cycle ▫ stylesheet_link_tag ▫ javascript_include_tag • Zahlenformatierung ▫ number_to_currency ▫ number_with_delimiter ▫ number_to_human_size ▫ number_to_percentage • Textmanipulation ▫ excerpt ▫ highlight ▫ truncat ▫ word_wrap ▫ pluralize
  • 62. 62 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Eigene Helper
  • 63. 63 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Übungen • Layout mit Helper anlegen ▫ Die einzelnen Layouts die in views/layout liegen durch ein Anwendungsweites Layout (application.html.erb) ersetzen. ▫ In dieses neue Layout eine einfache Navigationsleiste einfügen. Diese soll es ermöglichen in jedem View zu der Index-Seite von People, Orders, Items zu navigieren. ▫ Diese Verlinkung soll mithilfe des link_to-Helpers realisiert werden. • Währungsformatierung des Item-Preises ▫ Die Ausgaben des Preises in der Items-Liste soll mithilfe des number_to_currency Helpers realisiert werden.  Infos siehe Rails API Docs (link auf Desktop) suchen nach link_to bzw. number_to_currency V3->
  • 64. 64 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Layout mit Helper anlegen 1. Öffnen von views/layout/orders.html.erb 2. Einfügen der Navigationslinks: <=% link_to quot;Peoplequot;, people_path %> | <=% link_to quot;Itemsquot;, items_path %> | <=% link_to quot;Ordersquot;, orders_path %> 3. Ergebnis prüfen: ▫ http://localhost:3000/orders ▫ http://localhost:3000/people ▫ http://localhost:3000/items 4. Umbenennen der orders.html.erb in application.html.erb und löschen der anderen Layoutdateien
  • 65. 65 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Währungsformatierung des Item-Preises 1. Öffnen views/items/index.html.erb 2. Preisausgabe verändern <%=h number_to_currency(item.price, :unit => '€ ', :separator => ',', :delimiter => '.') %> ->V4
  • 66. 66 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
  • 68. 68 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Wie funktionieren Controller in Rails http://wiki.rubyonrails.org/rails/pages/UnderstandingRailsMVC
  • 69. 69 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Vererbung ActionController::Base ApplicationController OrdersController PeopleController ItemsController
  • 70. 70 Christian Feser, Michael Kram, Jakob Schröter, 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 … <% form_for(@order) do |f| %> View …. <%end>
  • 71. 71 Christian Feser, Michael Kram, Jakob Schröter, 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 Schröter, Marc Seeger Controller einrichten 1. Anschauen, was bereits wie funktioniert 2. Fertig ;-)
  • 74. 74 Christian Feser, Michael Kram, Jakob Schröter, 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: <%= @order.total_price %> V4->
  • 76. 76 Christian Feser, Michael Kram, Jakob Schröter, 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 Löscht die angegebene Ressource
  • 77. 77 Christian Feser, Michael Kram, Jakob Schröter, 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 Schröter, Marc Seeger RESTful Rails
  • 79. 79 Christian Feser, Michael Kram, Jakob Schröter, 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 Schröter, Marc Seeger Setzen und Abfragen von Sessions • Session ist standardmäßig immer aktiviert • Beispielcode: session[:user_id] = user.id • Session-Management kann für einzelne Controller deaktiviert werden Class InfoController < ApplicationController session :off end
  • 81. 81 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
  • 83. 83 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Validatoren
  • 84. 84 Christian Feser, Michael Kram, Jakob Schröter, 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 Schröter, Marc Seeger Validatoren für 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 Schröter, Marc Seeger Abhängigkeiten Item Item Person Order Item • Können im Model mit den Assoziationen definiert werden. ▫ :dependent => :nullify (Standard) ▫ :dependent => :destroy ▫ :delete_all
  • 87. 87 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Abhängigkeiten 1. Öffnen Models/person.rb 2. Eintragen der Abhängigkeit has_many :orders, :dependent => :destroy 3. Testen der Abhängigkeit ▫ Durch Löschen einer Person http://localhost:3000/people ▫ Überprüfung der Verknüpfungstabelle im SQLite Manager in Firefox
  • 88. 88 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
  • 89. 89 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
  • 90. 90 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Diskussion
  • 91. 91 Christian Feser, Michael Kram, Jakob Schröter, Marc Seeger Unsere Meinung ->V5
  • 92. 92 Christian Feser, Michael Kram, Jakob Schröter, 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): O‘Reilly Verlag • http://api.rubyonrails.org/ Übungsbild: http://rubyonrailsprogrammingguide.com/basics/why-ruby-on- rails-part-2/