Ruby
   A Programmer’s Best Friend




Jonathan Weiss <jw@innerewut.de>

               1
Überblick
Einführung
Getting started
Grundlagen
Blocks und Iteratoren
Goodies
Resources
Ruby on Rails - Übung
            ...
Einführung


    3
Ruby?
Ruby ist eine vollständig
objektorientierte
Skriptsprache

Das Beste von Perl und
Python

Public release 1995 durch
...
Wichtigste Eigenschaften
 Interpretierte Skriptsprache
 Aktuell ist Ruby 1.8.2
 Komplett Objekt-Orientiert
 Dynamische Typ...
The 5 E’s

Everything is an object
Elegant blocks give inline power
Exploring with reflection
Extending at runtime
Extensi...
Beispiel 0
5.times do puts “ruby ist cool”.upcase end



Output:
RUBY IST   COOL
RUBY IST   COOL
RUBY IST   COOL
RUBY IST ...
Getting Started


       8
Ruby installieren
 GPL , somit Sourcen verfügbar:
CVS, tar, make && make install


 Binary installer für Windows
http://ru...
Ruby ausführen
 Interpreter aufrufen und Skript
 übergeben:
prompt> ruby meinprogramm.rb
 Shebang:
#!/usr/local/bin/ruby
p...
Interactive Ruby
Interactive Ruby (irb) ist eine Ruby
“Shell”
Erlaubt ausführen von eingegeben Code
oder lesen von Code au...
Demo




       12
Dokumentation
Ruby wird meist in RDoc dokumentiert
(vergleichbar JavaDoc)
Konvertierung in HTML und ri
ri erlaubt Zugang ü...
Demo




       14
Grundlagen


    15
Grundregeln
Kein Semikolon am Ende der Zeile (bei
einer Anweisung pro Zeile)
Keine geschweiften Klammern zur
Deklaration v...
Alles ist ein Objekt
 Nummern und Strings sind auch
 Objekte
 “nil” als Null-Objekt statt null-pointer
 Zugang zu Instanz-...
Beispiel 1
a=9
b=1
c=a+b
print c ; c = “Hi”; print c
d = c.length + c.index(”i”)
c = -99.abs
ein_string = String.new(”HALL...
Funktionen/Methoden
 Einleitung mit
def funktions_name(argument)
....
end
 implizites return des letzten
 Ausdruckes (wie ...
Beispiel 2
def my_func
 puts “abc”
 99
end
def my_func2(a, b)
 return a+b
end
def a; “a”; end

ergebnis = my_func(1,2)
a()...
Namen

Klassen, Konstanten und Module
fangen mit Grossbuchstaben an
Methodennamen sind kleingeschrieben
Variablen (somit O...
Namen 2

Instanzvariablen fangen mit @ an
Klassenvariablen fangen mit @@ an
Globale Variablen beginnen mit $
Lokale Variab...
Klassen
 Zugriff auf Klasseneigenschaften über
Klasse.methode(arg1, arg2, arg3)
Klasse.klassenvariable
Klasse::KONSTANTE
 ...
Beispiel 3
class Person
  @name                  #Instanz-var
  @alter                  #Instanz-var
  @@anzahl_auf_der_we...
Beispiel 3 cont
class Person
  def Person.how_many
    @@anzahl_auf_der_welt
  end
end

anzahl = Person.how_many




     ...
Vererbung

Konstruktor-Methode ist “initialize”
class a < b   bedeutet, dass a von b erbt
“super” ist der Konstruktor der
...
Demo




       27
Access Control

Private, public und protected
Methoden sind default public
Instanzvariablen gar nicht zugänglich,
man muss...
Beispiel 4
class Person
  @name                    #Instanz-var
  @alter                   #Instanz-var
  def name
    @na...
Attribute

Zuweisung auf Instanzvariablen durch
Methoden:
def funk_name=(arg)
....
end

                                  ...
Beispiel 5
class Person
  def name=(wie_soll_ich_heissen)
    @name = wie_soll_ich_heissen
  end
  attr_writer :alter
end
...
Automatische Attribute


Benutzung der Macros “attr_reader”,
“attr_writer” oder “attr_access”




                        ...
Standard Datentypen
Numbers (Fixum, Bignum)
Strings
Array
Hash
Regular expression
Range
                          33
Beispiel 6
string_a = “HUIBU”
fixnummer = 9
big_nummer = 1.23e10
m_array = [”a”, “b”, [1,2], “c”, 3]
mein_hash = {’anfang’ ...
Blocks und Iteratoren


          35
Blocks
Blocks sind eine Art anonyme
Funktion
Sie werden (fast) immer mit
“normalen” Funktionen eingesetzt
Dabei wird der K...
Blocks

Blocks werden auf der selben Zeile wie
der Methoden-Aufruf geschrieben
Notation in {...} oder do...end
Die “normal...
Beispiel 7
def foo
 yield
 puts “2 von foo”
 yield
end

foo { print “2 von Block”}


Output:
2 von Block
2 von foo
2 von B...
Beispiel 8
def foo
 yield
 puts “2 von foo”
 yield
end

foo do
  puts “2 von Block”
end

Output:
2 von Block
2 von foo
2 v...
Yield
 Yield kann auch Variablen übergeben,
 die an den Block weitergereicht werden
 Das Ergebnis des Blocks wird die
 Rüc...
Beispiel 9
def foo(a, b)
 c=a+b
 print yield(c)
end

foo(1,2) do |var1|
  var1 * 2
end

Output:
6



                     41
Iteratoren
Iteratoren sind Funktionen, die Blocks
repetitiv aufrufen
Finden dort Einsatz, wo andere
Sprachen normalerweise...
Beispiel 9
5.times { puts “Hi”}

a = [1, 2]
a.each do |the_one|
  print the_one
end

[”H”, “A”, “L”].collect {|x| x.succ} ...
Beispiel 10
class Array
  def find
    for i in 0..size
      value = self[i]
      return value if yield(value)
    end
  ...
Proc Objekt
Man kann Blocks mit Hilfer der lamba
Funktion oder des Konstruktor der Proc-
Klasse in Objekte verwandeln
Dies...
Demo




       46
Goodies


   47
Exceptions

Ruby unterstützt und benutzt (!!!)
Exceptions
Schlüsselwörter raise, rescue und ensure
Kontrollflußsteuerung ü...
Beispiel 11
begin

 funktion_die_schief_laufen_kann(1,2,”aaa”)

rescue StandardError

 puts “Fehler aufgetreten”

ensure

...
Integrierter Debugger


Aufrufbar über:
prompt> ruby -r debug skript.rb
Breakpoint, Watches, Steps,....



               ...
Integriertes UnitTest
Framework
 Ruby 1.8 hat das Test::Unit Framework
 integriert
 Unterstützung von Cases +Suits
 Neuer ...
Mixes
Module und deren Eigenschaften
können in beliebige Klassen “gemixt”
werden
Diese erhalten somit alle Methoden und
Va...
RubyGems
 Paketverwaltung für Ruby Programme
 und Bibliotheken
 Vergleichbar mit Pear und CPAN
 Installation von Programme...
erb, eruby und
mod_ruby
erb und eruby sind filter, die es
erlauben, Ruby Code in HTML
unterzubringen (PHP)
<h1> Willkommen...
Ruby on Rails

Framework für Web-Anwendungen
Model-View-Controller Ansatz
Nur eine Konfigurationsdatei:
Datenbank Zugangsd...
Integrierter Webserver

WEBrick ist ein in Ruby geschriebener
Webserver, der in der Standard
Distribution enthalten ist
Ka...
Grafische Oberflächen

RubyTK/GTK, FXRuby, ruby-gnome2,
QT/Ruby, Ruby/Cocoa, WxRuby,
FLTK, RubyWise, ParaGUI,
Widestudio, ...
Taint Obejcts
Taint-modus, ähnlich wie bei Perl
Setzen des Levels(1-4) über $SAFE
Alle externen Daten sind “tainted”
Taint...
Reflection

Ruby hat massive Reflection API
Möglich unbekannte Objekte, Klassen,
Module und Funktionen zu inspizieren
Wich...
Distributed Ruby

drb erlaubt ausführen von RubyCode
auf entfernen Rechnern
Vergleichbar CORBA, Java-RMI
Einfach und schne...
Crossplatform IDE
FreeRIDE ist eine Ruby IDE
für Windows, UNIX und
Mac OS X

Unterstützung von
Debugging, Code
completion,...
Resources


    62
Prgramming Ruby
The PickAxe Book

Standardwerk von
den Pragmatic
Programmers

Tutorial und
Referenz

Absolut zu
empfehlen
...
www.ruby-lang.org

Rubys Homepage
Sourcecode und FAQ
Links zu anderen Ruby Seiten
Ruby Application Archive (RAA)


       ...
www.ruby-doc.org


Zentrale Dokumentation
RDoc Dokumentation als HTML
Erste Version PickAxe als HTML



                  ...
www.rubygarden.org


WebBlog/Wiki von Ruby Entwicklern
Viele gute Artikel zum Thema Ruby
Viele gute Links



             ...
Bibliotheken und Pakete
 RubyForge
http://www.rubyforge.org
 Ruby Production Archive
http://rpa-base.rubyforge.org/wiki/
w...
Ruby on Rails
     Übung




      68
Ruby on Rails

Framework für Web-Anwendungen
Model-View-Controller Ansatz
Nur eine Konfigurationsdatei:
Datenbank Zugangsd...
Überblick


Einführung MVC
Überblick Rails-Architektur
Übung



                              70
Model-View-Controller
Design-Pattern für Programme mit
Interaktion mit dem Benutzer
KLassen werden in drei Gruppen
eingete...
Model

Klasse, die das Business-Objekt abbildet
mit allen seinen Funktionalitäten
BSP:
Klasse Benutzer
Klasse Buch

      ...
View
Eigentliche Darstellung für den User
Keine Funktionalität, nur Design
+Anzeige
BSP:
 Template, dass alle Bücher im Sy...
Controller
Verbindung zwischen Model und View
Lädt benötigte Daten aus dem Model
und füttert sie in den View
Prozess-Logik...
Rails-Architektur




                    75
Active Record

Model
Verbindet Ruby-Klasse mit Daten aus
der Datenbank
Bereitstellung von Funktionen zur
Manipulation der ...
Action Controller

Controller
Bietet die eigentlichen Funktionalitäten
an, mit denen der Benutzer interagiert
Lädt den pas...
Action View

View
Ruby Template
HTML mit ERb-tags
Das was der Benutzer zu sehen
bekommt

                                78
Übung
Implementierung einer Webapplikation in weniger als 30
                      Minuten




                          79
Fin
Fragen?




  80
Nächste SlideShare
Wird geladen in …5
×

An Introduction to Ruby

6.594 Aufrufe

Veröffentlicht am

An Introduction to Ruby, the programming language by Jonathan Weiss. Presented at the Juniter Workend in 2005.

Veröffentlicht in: Technologie
0 Kommentare
0 Gefällt mir
Statistik
Notizen
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

Keine Downloads
Aufrufe
Aufrufe insgesamt
6.594
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
602
Aktionen
Geteilt
0
Downloads
122
Kommentare
0
Gefällt mir
0
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie

An Introduction to Ruby

  1. 1. Ruby A Programmer’s Best Friend Jonathan Weiss <jw@innerewut.de> 1
  2. 2. Überblick Einführung Getting started Grundlagen Blocks und Iteratoren Goodies Resources Ruby on Rails - Übung 2
  3. 3. Einführung 3
  4. 4. Ruby? Ruby ist eine vollständig objektorientierte Skriptsprache Das Beste von Perl und Python Public release 1995 durch Yukihiro Matsumoto, a.k.a “Matz” 4
  5. 5. Wichtigste Eigenschaften Interpretierte Skriptsprache Aktuell ist Ruby 1.8.2 Komplett Objekt-Orientiert Dynamische Typbindung Verfügbar über GPL oder eigene Lizenz The 5 E’s (by DHH) 5
  6. 6. The 5 E’s Everything is an object Elegant blocks give inline power Exploring with reflection Extending at runtime Extensive standard libray 6
  7. 7. Beispiel 0 5.times do puts “ruby ist cool”.upcase end Output: RUBY IST COOL RUBY IST COOL RUBY IST COOL RUBY IST COOL RUBY IST COOL 7
  8. 8. Getting Started 8
  9. 9. Ruby installieren GPL , somit Sourcen verfügbar: CVS, tar, make && make install Binary installer für Windows http://rubyforge.org/projects/ rubyinstaller/ 9
  10. 10. Ruby ausführen Interpreter aufrufen und Skript übergeben: prompt> ruby meinprogramm.rb Shebang: #!/usr/local/bin/ruby print “a” 10
  11. 11. Interactive Ruby Interactive Ruby (irb) ist eine Ruby “Shell” Erlaubt ausführen von eingegeben Code oder lesen von Code aus Dateien Shell-Eigenschaften wie History, Job- Controll und Commandline-Editing Perfekt, um zu probieren und spielen 11
  12. 12. Demo 12
  13. 13. Dokumentation Ruby wird meist in RDoc dokumentiert (vergleichbar JavaDoc) Konvertierung in HTML und ri ri erlaubt Zugang über Kommandozeile: prompt> ri WAS_ICH_WISSEN_WILL 13
  14. 14. Demo 14
  15. 15. Grundlagen 15
  16. 16. Grundregeln Kein Semikolon am Ende der Zeile (bei einer Anweisung pro Zeile) Keine geschweiften Klammern zur Deklaration vom Blöcken, sondern “xxxx......end” Keine Deklaration von Variablen! () können bei Methoden weggelassen werden 16
  17. 17. Alles ist ein Objekt Nummern und Strings sind auch Objekte “nil” als Null-Objekt statt null-pointer Zugang zu Instanz-Methoden über: Instanz.methode(arg1, arg2) Zugang zu Instanz-Attributen über: Instanz.attribut = 5 17
  18. 18. Beispiel 1 a=9 b=1 c=a+b print c ; c = “Hi”; print c d = c.length + c.index(”i”) c = -99.abs ein_string = String.new(”HALLO”) auch_ein_string = ‘a’ + “bcdefg #{c}” 18
  19. 19. Funktionen/Methoden Einleitung mit def funktions_name(argument) .... end implizites return des letzten Ausdruckes (wie überall in Ruby) 19
  20. 20. Beispiel 2 def my_func puts “abc” 99 end def my_func2(a, b) return a+b end def a; “a”; end ergebnis = my_func(1,2) a() 20
  21. 21. Namen Klassen, Konstanten und Module fangen mit Grossbuchstaben an Methodennamen sind kleingeschrieben Variablen (somit Objekte) fangen mit Kleinbuchstaben an 21
  22. 22. Namen 2 Instanzvariablen fangen mit @ an Klassenvariablen fangen mit @@ an Globale Variablen beginnen mit $ Lokale Variablen beginnen mit Kleinbuchstaben 22
  23. 23. Klassen Zugriff auf Klasseneigenschaften über Klasse.methode(arg1, arg2, arg3) Klasse.klassenvariable Klasse::KONSTANTE Definition von Klassen-Methoden über Klassenname.methode 23
  24. 24. Beispiel 3 class Person @name #Instanz-var @alter #Instanz-var @@anzahl_auf_der_welt #Klassen-var MAX_ALTER = 100 #Konstante def check_alter(alter) #Instanz-meth alter < Person::MAX_ALTER end end a = Person.new if a.check_alter(90) puts “jung genug” end 24
  25. 25. Beispiel 3 cont class Person def Person.how_many @@anzahl_auf_der_welt end end anzahl = Person.how_many 25
  26. 26. Vererbung Konstruktor-Methode ist “initialize” class a < b bedeutet, dass a von b erbt “super” ist der Konstruktor der SuperKlasse 26
  27. 27. Demo 27
  28. 28. Access Control Private, public und protected Methoden sind default public Instanzvariablen gar nicht zugänglich, man muss erst passende Methoden erschaffen (Attribute) 28
  29. 29. Beispiel 4 class Person @name #Instanz-var @alter #Instanz-var def name @name end public def alter @alter end protected :alter end print “#{Hansi.name} ist #{Hansi.alter} Jahre alt” 29
  30. 30. Attribute Zuweisung auf Instanzvariablen durch Methoden: def funk_name=(arg) .... end 30
  31. 31. Beispiel 5 class Person def name=(wie_soll_ich_heissen) @name = wie_soll_ich_heissen end attr_writer :alter end Hansi = Person.new Hansi.name = “Hansi” Hansi.alter = 12 print “#{Hansi.name} ist #{Hansi.alter} Jahre alt” 31
  32. 32. Automatische Attribute Benutzung der Macros “attr_reader”, “attr_writer” oder “attr_access” 32
  33. 33. Standard Datentypen Numbers (Fixum, Bignum) Strings Array Hash Regular expression Range 33
  34. 34. Beispiel 6 string_a = “HUIBU” fixnummer = 9 big_nummer = 1.23e10 m_array = [”a”, “b”, [1,2], “c”, 3] mein_hash = {’anfang’ => “abc”, ‘ende’ => “xyz”} puts string_a + mein_hash[’anfang’] + m_array[0] meine_range = 1..10 meine_range.include?(5) 34
  35. 35. Blocks und Iteratoren 35
  36. 36. Blocks Blocks sind eine Art anonyme Funktion Sie werden (fast) immer mit “normalen” Funktionen eingesetzt Dabei wird der Kontrollfluß zwischen den Funktionen hin und her gereicht 36
  37. 37. Blocks Blocks werden auf der selben Zeile wie der Methoden-Aufruf geschrieben Notation in {...} oder do...end Die “normale” Funktion kann den Block über “yield” aufrufen 37
  38. 38. Beispiel 7 def foo yield puts “2 von foo” yield end foo { print “2 von Block”} Output: 2 von Block 2 von foo 2 von Block 38
  39. 39. Beispiel 8 def foo yield puts “2 von foo” yield end foo do puts “2 von Block” end Output: 2 von Block 2 von foo 2 von Block 39
  40. 40. Yield Yield kann auch Variablen übergeben, die an den Block weitergereicht werden Das Ergebnis des Blocks wird die Rückgabe von yield {|var1, var2| print var1 .....} do |var3, var4| ...end 40
  41. 41. Beispiel 9 def foo(a, b) c=a+b print yield(c) end foo(1,2) do |var1| var1 * 2 end Output: 6 41
  42. 42. Iteratoren Iteratoren sind Funktionen, die Blocks repetitiv aufrufen Finden dort Einsatz, wo andere Sprachen normalerweise Schleifen nutzen würden Intuitiv zu benutzten 42
  43. 43. Beispiel 9 5.times { puts “Hi”} a = [1, 2] a.each do |the_one| print the_one end [”H”, “A”, “L”].collect {|x| x.succ} --> [”I”, “B”, “M”] [1, 2, 3, 5, 7, 9].find {|v| v*v > 30} --> 7 43
  44. 44. Beispiel 10 class Array def find for i in 0..size value = self[i] return value if yield(value) end return nil end end 44
  45. 45. Proc Objekt Man kann Blocks mit Hilfer der lamba Funktion oder des Konstruktor der Proc- Klasse in Objekte verwandeln Diese kann man nun “rumreichen” Abfangen des Blocks und Umwandeln in Proc auch in der “normalen” Methode möglich 45
  46. 46. Demo 46
  47. 47. Goodies 47
  48. 48. Exceptions Ruby unterstützt und benutzt (!!!) Exceptions Schlüsselwörter raise, rescue und ensure Kontrollflußsteuerung über throw/catch 48
  49. 49. Beispiel 11 begin funktion_die_schief_laufen_kann(1,2,”aaa”) rescue StandardError puts “Fehler aufgetreten” ensure puts “wird immer ausgeführt” end 49
  50. 50. Integrierter Debugger Aufrufbar über: prompt> ruby -r debug skript.rb Breakpoint, Watches, Steps,.... 50
  51. 51. Integriertes UnitTest Framework Ruby 1.8 hat das Test::Unit Framework integriert Unterstützung von Cases +Suits Neuer Test: requiere test/unit class TestUser < Test::Unit::Case 51
  52. 52. Mixes Module und deren Eigenschaften können in beliebige Klassen “gemixt” werden Diese erhalten somit alle Methoden und Variablen Eine Art Java Interfaces nur mit Implementierung 52
  53. 53. RubyGems Paketverwaltung für Ruby Programme und Bibliotheken Vergleichbar mit Pear und CPAN Installation von Programmen in verschiedenen Versionen möglich gem install rails --remote gem upgrade --remote 53
  54. 54. erb, eruby und mod_ruby erb und eruby sind filter, die es erlauben, Ruby Code in HTML unterzubringen (PHP) <h1> Willkommen, <% print #{Hansi.name} %> </h1> mod_ruby vergleichbar mit mod_php 54
  55. 55. Ruby on Rails Framework für Web-Anwendungen Model-View-Controller Ansatz Nur eine Konfigurationsdatei: Datenbank Zugangsdaten THE REASON to check out Ruby 55
  56. 56. Integrierter Webserver WEBrick ist ein in Ruby geschriebener Webserver, der in der Standard Distribution enthalten ist Kann als Servlet-Container arbeiten 56
  57. 57. Grafische Oberflächen RubyTK/GTK, FXRuby, ruby-gnome2, QT/Ruby, Ruby/Cocoa, WxRuby, FLTK, RubyWise, ParaGUI, Widestudio, Apollo,.... Somit “normale” GUI-Programme möglich 57
  58. 58. Taint Obejcts Taint-modus, ähnlich wie bei Perl Setzen des Levels(1-4) über $SAFE Alle externen Daten sind “tainted” Tainted Objects können nicht an gefährliche Funktionen übergeben werden (z.B. System) 58
  59. 59. Reflection Ruby hat massive Reflection API Möglich unbekannte Objekte, Klassen, Module und Funktionen zu inspizieren Wichtig für Debugger, IDEs und dynamische Erweiterbarkeit 59
  60. 60. Distributed Ruby drb erlaubt ausführen von RubyCode auf entfernen Rechnern Vergleichbar CORBA, Java-RMI Einfach und schnell 1GHz PowerBook: 500 Calls pro Sek 60
  61. 61. Crossplatform IDE FreeRIDE ist eine Ruby IDE für Windows, UNIX und Mac OS X Unterstützung von Debugging, Code completion, Refactoring, remote pair-programming http:// freeride.rubyforge.org 61
  62. 62. Resources 62
  63. 63. Prgramming Ruby The PickAxe Book Standardwerk von den Pragmatic Programmers Tutorial und Referenz Absolut zu empfehlen 63
  64. 64. www.ruby-lang.org Rubys Homepage Sourcecode und FAQ Links zu anderen Ruby Seiten Ruby Application Archive (RAA) 64
  65. 65. www.ruby-doc.org Zentrale Dokumentation RDoc Dokumentation als HTML Erste Version PickAxe als HTML 65
  66. 66. www.rubygarden.org WebBlog/Wiki von Ruby Entwicklern Viele gute Artikel zum Thema Ruby Viele gute Links 66
  67. 67. Bibliotheken und Pakete RubyForge http://www.rubyforge.org Ruby Production Archive http://rpa-base.rubyforge.org/wiki/ wiki.cgi Ruby Application Archive http://raa.ruby-lang.org 67
  68. 68. Ruby on Rails Übung 68
  69. 69. Ruby on Rails Framework für Web-Anwendungen Model-View-Controller Ansatz Nur eine Konfigurationsdatei: Datenbank Zugangsdaten THE REASON to check out Ruby 69
  70. 70. Überblick Einführung MVC Überblick Rails-Architektur Übung 70
  71. 71. Model-View-Controller Design-Pattern für Programme mit Interaktion mit dem Benutzer KLassen werden in drei Gruppen eingeteilt, die sich auf ihre jeweillige Aufgabe spezialisieren Vorteil: Entkopplung und somit Wiederverwendbarkeit 71
  72. 72. Model Klasse, die das Business-Objekt abbildet mit allen seinen Funktionalitäten BSP: Klasse Benutzer Klasse Buch 72
  73. 73. View Eigentliche Darstellung für den User Keine Funktionalität, nur Design +Anzeige BSP: Template, dass alle Bücher im System anzeigt Template, dass alle Bücher eines Benutzers anzeigt 73
  74. 74. Controller Verbindung zwischen Model und View Lädt benötigte Daten aus dem Model und füttert sie in den View Prozess-Logik BSP: Lade alle Bücher im System und gebe sie dem richtigem Template 74
  75. 75. Rails-Architektur 75
  76. 76. Active Record Model Verbindet Ruby-Klasse mit Daten aus der Datenbank Bereitstellung von Funktionen zur Manipulation der Daten in der DB 76
  77. 77. Action Controller Controller Bietet die eigentlichen Funktionalitäten an, mit denen der Benutzer interagiert Lädt den passenden Action View 77
  78. 78. Action View View Ruby Template HTML mit ERb-tags Das was der Benutzer zu sehen bekommt 78
  79. 79. Übung Implementierung einer Webapplikation in weniger als 30 Minuten 79
  80. 80. Fin Fragen? 80

×