· 4 min read
Scaffolding (Teil 2)
Fügen wir beispielsweise eine Titelseite über die index-Methode in die PhotosController-Klasse ein:
class PhotosController < ApplicationController
scaffold :photo
def index
render_text(‘Willkommen auf der Photo Share Titelseite’)
end
end
Laden Sie nun http://localhost:3000/photos/index. Sie sehen die Meldung »Willkommen auf der Titelseite von Photo Share« wie in Abbildung 4-2, was zeigt, dass Sie die index-Methode überschrieben haben, die durch das Scaffolding zur Verfügung gestellt wurde.
Laden Sie http://localhost:3000/photos/list, um sicherzustellen, dass der Rest des Scaffoldings noch immer intakt ist. Rails macht es einem auch leicht, einen View zu ersetzen, während das Controller-Scaffolding erhalten bleibt. Lassen Sie uns den View für die show-Aktion ersetzen. Legen Sie die Datei app/views/photos/show.rhtml an:
Photos anzeigen
Dateiname: <%= @photo.filename %>
<%= link_to ‘Photoliste’, :action => ‘list’, :id => @photo %>
Sie sehen den erzeugten View in Abbildung 4-3. Wie vorhin können Sie einige Views ersetzen, während andere unangetastet bleiben. Wie Sie sehen, bleibt das Scaffolding aktiv, bis Sie es überschreiben. Ist das der Fall, verschwindet es Stückchen für Stückchen, je nachdem, wie Sie es ersetzen.
Das Scaffolding ist dynamisch
Sie können das Rails-Scaffolding nutzen, um eine einfache Benutzerschnittstelle zur Verfügung zu stellen, während Sie an Ihrem Datenbankschema arbeiten. Die Benutzer können überprüfen, ob Sie alle benötigten Daten verwenden. Sehen wir uns an, wie das Rails-Scaffolding Änderungen an einem Schema handhabt. Wir beginnen damit, zusätzliche Spalten für einen Timestamp, ein Vorschaubild (»Thumbnail«) und eine Beschreibung in die Datenbank einzufügen. Legen Sie eine neue Migration namens add_photo_columns an. Sie ändern die Definition der photos-Tabelle dann, indem Sie ruby script/generate migration add_photo_columns eingeben. Editieren Sie die resultierende Migration in db/migrate so, dass sie wie folgt aussieht:
class AddPhotoColumns < ActiveRecord::Migration
def self.up
add_column “photos”, “created_at”, :datetime
add_column “photos”, “thumbnail”, :string
add_column “photos”, “description”, :string
Photo.find(:all).each do |photo|
photo.update_attribute :created_at, Time.now
photo.update_attribute :thumbnail, photo.filename.gsub(’.’, ‘_m.’)
end
end
def self.down
remove_column “photos”, “created_at”
remove_column “photos”, “thumbnail”
remove_column “photos”, “beschreibung”
end
end
Dieses Migrationsskript aktualisiert die Photos-Tabelle und die darin enthaltenen Daten. Nun führen Sie die Migration aus, indem Sie rake migrate eingeben und die Seite (http://localhost:3000/photos/list) im Browser neu laden. Die neuen Spalten erscheinen wie in Abbildung 4-4. Tatsächlich funktionieren alle Scaffolding-Views. Mittels Scaffolding können Sie Ihr Datenbankschema und -modell schnell anpassen, ohne sich gleichzeitig auf die Entwicklung der Benutzerschnittstelle konzentrieren zu müssen.
Vor- und Nachteile
Sie haben gerade gesehen, wie man das Scaffolding mit Hilfe des scaffold-Tags bzw. mit Hilfe der Metaprogrammierung nutzt. Dieser Scaffolding-Ansatz hat gegenüber anderen Frameworks (etwa der Codegenerierung) einige entscheidende Vorteile:
- Das scaffold-Tag ist dynamisch. Sie können unbesorgt an Ihrem Datenbankschema arbeiten, und die Schnittstelle passt sich automatisch an.
- Sie können Controller-Methoden oder Views überschreiben, ohne das gesamte Scaffolding selbst pflegen zu müssen.
- Das Scaffold-Tag ist sehr kompakt, d.h., Sie erreichen mit einer einzigen Codezeile sehr viel.
Generell bietet der Rails-Ansatz der Metaprogrammierung revolutionäre Vorteile gegenüber der Codegenerierung. Der wichtigste ist wohl, dass sich das dynamische Scaffolding kontinuierlich der Umgebung anpasst. Der Metaprogrammierungsansatz besitzt aber auch einige wesentliche Nachteile:
- Sie wissen nicht, was passiert. Wenn Sie Rails und das Scaffolding kennenlernen, ist es von großem Nachteil, dass der Code vor Ihnen verborgen bleibt.
- Das Verhalten des Scaffoldings könnte sich bei späteren Rails-Versionen verändern. Dieses Verhalten könnte sich als Nachteil herausstellen, wenn Ihnen Vorhersagbarkeit wichtig ist.
- Sie können den Scaffolding-Code nicht als Basis für die weitere Entwicklung verwenden.
Aus diesen Gründen bietet Rails die Codegenerierung als Alternative zum Scaffolding an. Wir sehen uns als Nächstes an den Scaffolding-Codegenerator.
Dieses Tutorial stammt aus dem Buch “Durchstarten mit Rails” aus dem O’Reilly Verlag. Details zu dem Buch