Ruby On Rails - 2. Rails Introduction

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

0 comments

Post a comment

    Post a comment
    Embed Video
    Edit your comment Cancel

    3 Favorites

    Ruby On Rails - 2. Rails Introduction - Presentation Transcript

    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
    3. Grundlagen
    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
    12. Rails installieren
    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
    16. Startschuss Projekt: OnlineShop
    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…
    23. Anwendungs-Anforderungen Projekt: OnlineShop
    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 => \"name = 'XYZ' \") Item.find(:all, :order => \"created_at DESC\") 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 = \"NeuerName\" person.save person.update_attribute(:firstname, \"NeuerName\")
    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
    42. View Benutzerschnittstelle
    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 \"Submit\" %> 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+\" \"+p.lastname, p.id]} %> • HTML-Ausgabe: <select id=\"order_person_id\" name=\"order[person_id]\"> <option value=\"1\">Hans Wurst</option> <option value=\"2\">Gabi Schnabel</option> <option value=\"5\">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+\" \"+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
    55. Layouts/Partials Don‘t repeat yourself…
    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 => \"form\" %> 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 => \"form\", :locals => {:submit_text => \"Change\"} %> 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 => \"form\", :locals => {:submit_text => \"Buttontext\"} %> 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 \"People\", people_path %> | <=% link_to \"Items\", items_path %> | <=% link_to \"Orders\", 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
    67. Controller
    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 ;-)
    73. Businesslogik …im Controller?
    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->
    75. Webservices
    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
    82. Zugabe …weil Rails Spaß macht. Oder?
    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/
    SlideShare Zeitgeist 2009

    + jakob.schroeterjakob.schroeter Nominate

    custom

    3136 views, 3 favs, 3 embeds more stats

    A 180 min introduction on Ruby on Rails programming more

    More info about this document

    © All Rights Reserved

    Go to text version

    • Total Views 3136
      • 3128 on SlideShare
      • 8 from embeds
    • Comments 0
    • Favorites 3
    • Downloads 57
    Most viewed embeds
    • 6 views on http://www.marc-seeger.de
    • 1 views on http://209.85.229.132
    • 1 views on http://marc-seeger.de

    more

    All embeds
    • 6 views on http://www.marc-seeger.de
    • 1 views on http://209.85.229.132
    • 1 views on http://marc-seeger.de

    less

    Flagged as inappropriate Flag as inappropriate
    Flag as inappropriate

    Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

    Cancel
    File a copyright complaint
    Having problems? Go to our helpdesk?

    Categories