Mit unserem Rails Connector kann man aus Rails-Anwendungen heraus auf die CMS-Dateien zugreifen. Hierfür stellt der Rails Connector die Variable @obj zur Verfügung, die die auszuliefernde Datei repräsentiert. So kann man beispielsweise mit @obj.abstract den Wert des Feldes abstract ermitteln.
@obj gehört zur Klasse Obj. Bis Version 6.7.2 bildet der Rails Connector auf der Grundlage des Vorlagennamens automatisch Subklassen von Obj, so dass beispielsweise eine CMS-Datei mit der Vorlage NewsArticle automatisch eine Instanz der Klasse NewsArticle ist.
Ab Version 6.7.3 werden Subklassen von Obj nicht mehr automatisch erzeugt, sondern alle CMS-Dateien gehören immer zur Klasse Obj. Enthält die Applikation jedoch eine von Obj abgeleitete Klasse, deren Name dem Namen einer Vorlage entspricht, so sind Dateien mit dieser Vorlage automatisch Instanzen dieser Klasse.
Vorlagen-Klassen lassen sich nutzen, um CMS-Dateien, die eine bestimmte Vorlage haben, um die gewünschten Eigenschaften und Methoden zu erweitern. Sollen etwa alle CMS-Dateien mit der Vorlage Product bewertbar sein, so kann man hierfür das Modell für Product folgendermaßen definieren:
# This Model describes the behavior of all CMS objects of the Product class. class Product < Obj has_many :ratings, :dependent => :delete_all, :foreign_key => :obj_id def rate(score) rating = ratings.find_by_score(score) || ratings.build(:score => score) rating.count += 1 rating.save end def count_for_score(score) rating = ratings.find_by_score(score) rating ? rating.count : 0 end def rated? !ratings.empty? end def average_rating raise TypeError unless rated? sum, count = ratings.inject([0, 0]) do |(sum, count), rating| [sum + rating.score * rating.count, count + rating.count] end sum.to_f / count.to_f end def average_rating_in_percent if rated? (100 * average_rating / Rating::MAXIMUM).to_i else 0 end end def reset_rating ratings.clear end end
Vorlagen- und dateispezifische Action-Namen
Die voreingestellte Action beim Zugriff auf eine CMS-Datei obj ist ìndex. Um bei einzelnen Vorlagen andere Actions zu nutzen, kann im gegebenenfalls anzulegenden Model für den betreffenden Contoller die Methode controller_action_name überschrieben werden. Die Action ließe sich beispielsweise aus einem Feld action der CMS-Datei auslesen:
class Product < Obj # ... def controller_action_name self[:action] end end
Um für alle Instanzen von Obj unabhängig von der Vorlage die auszuführende Action zu berechnen, implementieren Sie controller_action_name in der Datei obj_extensions.rb Ihrer Webanwendung.
Anmerkung zu Klassennamen
Ruby verlangt, dass Klassennamen der CamelCase-Notation folgen, d.h. mit einem Großbuchstaben beginnen. Wir empfehlen dringend, Vorlagen, deren Name nicht dieser Konvention entspricht, umzubenennen. Welche Vorlagen betroffen sind, kann mit dem Rake-Task check:obj_classes ermittelt werden. Danach können die Vorlagen mit dem Tcl-Kommando renameObjClass umbenannt werden.