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.