1. Daniel Dengler
web developer
Ruby on Rails
Workshop SS 2009
„Ruby on Rails“ and the Rails-Logo are registered trademarks of David Heinemeier Hansson – www.rubyonrails.org
8. Einen Controller erstellen
script/generate controller ControllerName actions
Anmerkungen zu script/generate:
• script/generate ohne Argumente zeigt alle
aktuell verfügbaren Generatoren
• script/generate Generator zeigt die verfügbaren
Parameter des jeweiligen Generators
9. Einen Controller erstellen
script/generate controller Home index imprint
Datei: app/controllers/home_controller.rb
class HomeController < ApplicationController
def index
end
def imprint
end
end
11. Aufgaben von Controllern
• steuern die Anwendung
• können Daten unter Verwendung von
ActiveRecord verändern
• bereiten Daten für die Darstellung
(den View) vor
• entscheiden, welcher View gezeigt werden soll
12. Aufgaben von Views
• zeigen die vom Controller erhaltenen Daten im
gewünschten Format an
• enthalten Verweise zu anderen Controllern
bzw. deren Actions (Methoden im Controller)
• ermöglichen die Eingabe von Daten
13. Aufgaben von Helpern
können häu ger verwendete Funktionalität für
Views bereitstellen
Beispiele:
• kleines Benutzerpro l, welches an mehreren Stellen
der Anwendung gebraucht wird
• Abkürzungen für Einfügungen wie etwa
icon(:edit) an Stelle von image_tag(quot;icons/edit.pngquot;)
14. Actions in Controllern
Jede öffentliche (public) Methode eines Controllers
ist von außen über den Browser erreichbar und
stellt eine Action dar
Wie im Internet üblich, wird als Standardaktion die
Methode index aufgerufen, falls diese existiert
15. Grundlegende Funktionen von
Controllern
redirect_to leitet die aktuelle Anfrage an eine andere URL
weiter
render gibt etwas im Browser aus, das nicht der Konvention
entspricht.
Konvention für Views, falls nicht mit einer der obigen
Funktionen etwas anderes bestimmt wurde:
• Der Name des auszugebenden Views entspricht dem
Namen der aktuellen Action im Ordner des aktuellen
Controllers
16. Etwas zurückgeben
class HomeController < ApplicationController
# URLs:
# /home
# /home/index
def index
render :nothing => true Nichts ausgeben
end
# URL: /home/imprint
def imprint
render :text => quot;imprintquot; Text ausgeben
end
end
17. Etwas zurückgeben
class HomeController < ApplicationController
# Gibt das Template der Methode imprint zurück
# Achtung: die Methode selbst wird hierbei NICHT ausgeführt!
def index
Action Template ausgeben
render :imprint
end
# Gibt das template /apps/views/home/imprint.html.erb zurück
def imprint
Action Template implizit ausgeben
end
end
18. Den Besucher weiterleiten
class HomeController < ApplicationController
# Leitet den Beutzer an die Action imprint weiter
def index
redirect_to :action => quot;imprintquot;
end
# Gibt das template /apps/views/home/imprint.html.erb zurück
def imprint
end
end
20. RHTML Templates
<% %> wird verwendet um Ruby Code in RHTML Templates
einzubetten
<%= %> wird verwendet um Ruby Code in RHTML Templates
auszugeben
RHTML Templates werden im Ordner views in den
Unterordnern des jeweiligen Controllers unter dem Namen
der aktuellen Action gesucht
(z.B. views/home/index.html.erb)
21. Grundlegende Funktionen von RHTML Views
• link_to stellt Verknüpfungen her
• h codiert HTML Zeichen um das einschleusen fremder
Tags zu verhindern
• render erlaubt die Ausgabe von Subtemplates / Partials
22. Grundlegende Funktionen von RHTML Views
# controllers/home_controller.rb
class HomeController < ApplicationController
def index
@projects = [quot;onequot;, quot;twoquot;]
end
def imprint
end
end
# views/home/index.html.erb
<ul>
<% @projects.each do |project| %>
<li><%= project %></li>
<% end %>
</ul>
<p>
<%= link_to quot;textquot;, :action => quot;imprintquot; %>
</p>
23. Grundlegende Funktionen von RHTML Views
# controllers/home_controller.rb
class HomeController < ApplicationController
def index
@projects = [quot;onequot;, quot;twoquot;]
end
def imprint
end
end
# views/home/index.html.erb
<%= render :partial => 'projects', :locales => { :projects => @projects } %>
<p>
<%= link_to quot;textquot;, :action => quot;imprintquot; %>
</p>
# views/home/_projects.html.erb
<ul>
<% projects.each do |project| %>
<li><%= project %></li>
<% end %>
</ul>
28. Aufgaben von Modellen
• kümmern sich um die Datenhaltung
• enthalten die Datenlogik der Anwendung
• sorgen für eine konsistente Datenhaltung
• erlauben die vereinfachten Zugriff auf die
Daten, ohne sich mit SQL näher beschäftigen
zu müssen
29. Crash-Kurs Datenbanken (1)
Tabelle: projects
created_at updated_at
id (int) title (string)
(datetime) (datetime)
1 Blog 1241387013 1241387013
2 Welteroberung 1241387044 1241387044
Diese Kurs
3 1241387048 1241387048
bestehen
30. Crash-Kurs Datenbanken (1)
Tabelle: projects
created_at updated_at
id (int) title (string)
(datetime) (datetime)
Zeile
1 Blog 1241387013 1241387013
2 Welteroberung 1241387044 1241387044
Diese Kurs
3 1241387048 1241387048
bestehen
31. Crash-Kurs Datenbanken (1)
Tabelle: projects
created_at updated_at
id (int) title (string)
(datetime) (datetime)
Modell
1 Blog 1241387013 1241387013
Instanz
2 Welteroberung 1241387044 1241387044
Diese Kurs
3 1241387048 1241387048
bestehen
32. Crash-Kurs Datenbanken (1)
Tabelle: projects
created_at updated_at
id (int) title (string)
(datetime) (datetime)
1 Blog 1241387013 1241387013
2 Welteroberung 1241387044 1241387044
Diese Kurs
3 1241387048 1241387048
bestehen
Abfragesprache (SQL):
SELECT * FROM projects WHERE id = 1;
33. Crash-Kurs Datenbanken (1)
Tabelle: projects
created_at updated_at
id (int) title (string)
(datetime) (datetime)
1 Blog 1241387013 1241387013
2 Welteroberung 1241387044 1241387044
Diese Kurs
3 1241387048 1241387048
bestehen
Abfragesprache (SQL):
SELECT * FROM projects WHERE id = 1;
34. Crash-Kurs Datenbanken (1)
Tabelle: projects
created_at updated_at
id (int) title (string)
(datetime) (datetime)
1 Blog 1241387013 1241387013
2 Welteroberung 1241387044 1241387044
Diese Kurs
3 1241387048 1241387048
bestehen
Abfragesprache Ruby (mittels ActiveRecord):
Project. nd(1)
36. Migrations
• In Migrations werden Änderungen an der
Datenbankstruktur im zeitlichen Verlauf
festgehalten
• Migrations sind unabhängig von den
eigentlichen Datenmodellen
• Im Idealfall auszuführen auf einem
Datenbanksystem mit einer Transactional Data
De nition Language, da andernfalls Fehler die
Datenbankstruktur zerstören könnten
37. Migrations
ActiveRecord Migration
ActiveRecord ist unabhängig von den Migrations
38. Migrations
ActiveRecord Migration
ActiveRecord ist unabhängig von den Migrations
39. Migrations
ActiveRecord Migration
DB
Die Migrations de nieren die Datenbankstruktur,
die von ActiveRecord genutzt wird
46. Einsatz von Migrations
Migration Migration Migration
Entwickler 1 t1 t2 t3
Migration Migration Migration
Entwickler 2 t1 t2 t3
Migration Migration Migration
Produktivsystem t1 t2 t3
47. Einsatz von Migrations
Migration Migration Migration
Entwickler 1 t1 t2 t3
Migration Migration Migration
Entwickler 2 t1 t2 t3
Migration Migration Migration
Produktivsystem t1 t2 t3
48. Einsatz von Migrations
Migration Migration Migration
Entwickler 1 t1 t2 t3
Migration Migration Migration
Entwickler 2 t1 t2 t3
Migration Migration Migration
Produktivsystem t1 t2 t3
49. Einsatz von Migrations
Migration Migration Migration
Entwickler 1 t1 t2 t3
Migration Migration Migration
Entwickler 2 t1 t2 t3
Migration Migration Migration
Produktivsystem t1 t2 t3
50. Einsatz von Migrations
Migration Migration Migration
Entwickler 1 t1 t2 t3
Migration Migration Migration
Entwickler 2 t1 t2 t3
Migration Migration Migration
Produktivsystem t1 t2 t3
51. Einsatz von Migrations
Migration Migration Migration
Entwickler 1 t1 t2 t3
Migration Migration Migration
Entwickler 2 t1 t2 t3
Migration Migration Migration
Produktivsystem t1 t2 t3
52. Konventionen in Rails
Name der Tabelle ist die Pluralform des Namens
des zugehörigen Modells
Beispiel:
• Name des Modells: project
• Name der Tabelle in der DB: projects
54. wichtige Datentypen
Rails MySQL
:boolean tinyint(1)
:integer int(11)
:float float
:string varchar(255)
:date date
:datetime datetime
Quelle: http://www.orthogonalthought.com/blog/index.php/2007/06/mysql-and-ruby-on-rails-datatypes/
55. # db/migrate/20090426223046_create_tasks.rb
class CreateTasks < ActiveRecord::Migration
# ausgeführt, sobald zu dieser Version migriert wird
def self.up
# Erstellen einer Tabelle tasks mit bestimmten Spalten
create_table :tasks do |t|
t.string :title, :null => false
t.boolean :done, :null => false, :default => false
t.timestamps
end
end
# ausgeführt, sobald diese Version zurückgenommen werden soll
def self.down
drop_table :tasks
end
end
56. wichtige Funktionen in Migrations
create_table Tabellenname &Block
Block beinhaltet die De nition der Tabellenspalten
in der Form:
• Blockvariable. Datentyp Spaltenname, Optionen
57. wichtige Funktionen in Migrations
Optionen können sein:
• :null => false (Nullwert nicht erlaubt)
• :default => Wert (Defaultwert festlegen)
drop_table Tabellenname
mehr in der API (ActiveRecord::Migration)
58. Rake
Scriptinterpreter für automatisierbare Aufgaben (häu g
während der Entwicklung verwendet)
Aufruf: rake Scriptname (weitere Parameter...)
Beispiel (Migration der Datenbank):
• rake db:migrate (VERSION=timestamp)
• keine Angabe einer Version migriert zur aktuellen
Version
63. Aufgabe
• Eine neue Anwendung anlegen
• Kein Scaffolding!
• Ein Datenmodell Project erstellen mit:
• Tabellenname: projects
• Einem Titel (title) - Datentyp: String
• Einer Beschreibung (description) - Datentyp: Text
• Einige Projekte mittels Rails-Konsole erstellen
• Eine Au istung der Projekte ausgeben, nachdem ein
entsprechender Controller (ProjectsController) mit
dazugehörigem View (index) erstellt wurde