Vorlagenspezifische Controller

Der Rails Connector ermöglicht es (ab Version 6.7.3), Controller zu definieren, die nur für bestimmte Vorlagen zuständig sind. Einen neuen Controller einzubinden, erfordert keinerlei Konfiguration, abgesehen davon, dass die Controller-Klasse angelegt werden muss.

Mögliche Anwendungsfälle sind:

  • Sehr viele Views, die man nach Vorlage gruppieren möchte
  • Umschaltung zwischen mehreren Ansichten für eine CMS-Datei
  • Auswertung von Session-/Cookie-/Parameter-Daten für bestimmte Vorlagen
  • Automatisches Laden des jeweils passenden Helper-Moduls (ohne helper :all)
  • Handling von POST-Requests, beispielsweise für die Realisierung von Formularen über CMS-Dateien
  • Ausgabe von CMS-Daten in mehreren Formaten, wie XML, HTML, JSON.

Der Rails Connector sucht für jede CMS-Datei, die angezeigt werden soll, nach einem Controller, dessen Name zur Vorlage der Datei passt. CMS-Dateien der Vorlage Publication würden, sobald ein Controller namens PublicationController existiert, der von RailsConnector::DefaultCmsController abgeleitet ist, von diesem ausgeliefert werden. Existiert er nicht, wird stattdessen CmsController verwendet.

Die Standard-Aktion zur Auslieferung einer CMS-Datei bleibt weiterhin index. Zusätzliche Aktionen können angesprochen werden, indem die Obj-Methode controller_action_name überschrieben wird.

Der Rails Connector stellt eine spezielle Testmethode zur Verfügung, um vorlagenspezifische Controller zu testen. Mit der Methode request.for_cms_object kann im Test definiert werden, welches Cms-Objekt geladen werden soll. Hier ein Beispiel für das Testframework rspec:

describe CmsController, "request for HTML document" do
  before do
    controller.stub!(:ensure_object_is_permitted).and_return(true)
    controller.stub!(:ensure_object_is_active).and_return(true)
    controller.stub!(:set_google_expire_header).and_return(true)
    @obj = mock_model(Obj, :mime_type => 'text/html', :permalink => 'dummy')
    request.for_cms_object(@obj)
  end

  it "should render the view" do
    get 'index'
    response.should be_success
  end
end