Vor einiger Zeit haben ich die Webanwendung decidre entwickelt. decidre ist ein Zufallsgenerator, der aus einer Liste von Optionen, die der Benutzer eingibt, eine auswählt. Super einfach eigentlich, aber eine große Hilfe für Entscheidungsunfreudige. decidre kann in jeglichen Lebenslagen hilfreich sein, sei es bei der Essens- oder Getränkewahl, bei Fragen rund um die Liebe oder bei der Wahl des nächsten Jobs, Urlaubziels, Autos, Fahrrad ... Deshalb gibt es außerdem noch einen Mini-Blog mit kurzen Geschichten.
decidre ist in Ruby on Rails umgesetzt, allerdings eingebettet in das CMS Refinery. Das bedeutet, dass mein individueller Code als Refinery-Modul eingebunden ist. Hier ist beschrieben, wie das geht. Ich nutze Refinery in Version 3.0.4 sowie das gem refinerycms-blog.
Die Integration zwischen dem CMS und meiner Erweiterung sieht so aus, dass das CMS der Master ist und mein Modul nur für einen begrenzten Bereich zuständig ist. Das Modul hat dabei keinen einfachen Zugriff auf CMS-Funktionalität. Einen andere Ansatz verfolgt das Ruby on Rails CMS ComfortableMexicanSofa, das ich hier beschrieben habe.
In der ersten Version von decidre habe ich Texte, die auf der Startseite erscheinen, in den Modul-Code geschrieben. Schöne wäre es jedoch, diese im CMS zu pflegen. So könnte ich den Inhalt leichter ändern, um ihn beispielsweise später noch für Suchmaschinen zu optimieren.
Ich stelle mir vor, kleine Textschnipsel im CMS zu pflegen und diese dann aus meinem Code heraus anzusprechen. Zwei verschiedene Lösungen schweben mir vor.
Snippets als Seiten anlegen
Seiten sind in Refinery eigentlich vollständige Seiten, die per URL im Browser aufgerufen werden. Trotzdem ist es einfach möglich, diese als Schnipsel zu missbrauchen.
Ich erstelle dazu eine neue Seite und nenne diese "Snippet: Welcome"
Wichtig ist es, diese unsichtbar zu machen über die Option "Display this page in the site menu". Diese muss deaktiviert sein.
Im Code kann ich nun den Seiteninhalt auslesen. In meinem Rails Controller setze ich diese als Variable.
@welcome_snippet = Refinery::Page.by_title('Snippet: Welcome').first.content_for(:body).html_safe
Das war's schon. Ich habe mich gefragt, ob es noch einen Nachteil dieses Vorgehens gibt. Zum Beispiel, dass diese Pseudo-Seite von Suchmaschinen gecrawlt werden könnte. Dazu habe ich einen Blick in die sitemap.xml geworfen:
Die Snippet-Datei erscheint hier nicht, da sie nicht im Menü erscheint. Per URL kann ich die Seite aufrufen, aber die kennt ja niemand.
Snippets über Refinery-Modul pflegen
Zwei Bibliotheken gibt es auf Github
Ich will mir genauer ansehen, was diese taugen.
keram/refinerycms-snippets
Diese Bibliothek ist leider seit 4 Jahren nicht mehr upgedatet worden. Nach viel Mühe bekomme ich sie ans Laufen und publiziere meine Änderungen als Pull Request. Ich bin gespannt was daraus wird. Mir erscheint das Projekt eingeschlafen zu sein. Hier meine aktualisierte Version als Github-Fork: https://github.com/bjoerne2/refinerycms-snippets.
greendog/refinerycms-snippets
Diese Bibliothek heißt genauso wie das vorherige Projekt und auch viele Dateien haben dieselben Namen. Es sieht auch noch optisch fast identisch aus. Trotzdem ist es kein Fork der obigen Bibliothek und es gibt auch keine expliziten Hinweise auf eine Verwandtschaft.
Ich bin ein bisschen misstrauisch, da die Bibliothek wenig beliebt ist: Nur 1 Star und 1 Fork, dazu die letzte Änderung vor einem Jahr.
Ich installiere das Modul gemäß der Anleitung. Dabei entstehen neue Datenbanktabellen:
== 20160828083153 CreateSnippetsSnippets: migrating =========================== -- create_table(:refinery_snippets) -> 0.0034s == 20160828083153 CreateSnippetsSnippets: migrated (0.0035s) ================== == 20160828083154 TranslateSnippets: migrating ================================ == 20160828083154 TranslateSnippets: migrated (0.0347s) ======================= == 20160828083155 CreateSnippetsPageParts: migrating ========================== -- create_table("snippets_page_parts") -> 0.0025s -- add_index("snippets_page_parts", :snippet_id) -> 0.0020s -- add_index("snippets_page_parts", :page_part_id) -> 0.0024s == 20160828083155 CreateSnippetsPageParts: migrated (0.0114s) =================
Die Bibliothek läuft nicht direkt, aber das ist mit ein paar Zeilen geschafft. Hier mein Github-Fork: https://github.com/bjoerne2/refinerycms-snippets-1.
Im Administrationsbereich von Refinery erscheint nun ein neuer Reiter Snippets und ich kann einzelne Snippets anlegen.
Die Bearbeitung erfolgt exakt wie bei Seiten.
In meinem Controller-Code lade ich das Snippet mit folgendem Code:
@welcome_snippet = Refinery::Snippets::Snippet.find_by_title('Welcome').body.html_safe
Ich entscheide mich für diese Variante. Nun kann ich im CMS den Willkommenstext der Startseite ändern. Meine Code-Änderungen habe ich ebenfalls als Pull Request eingestellt, einen Bug gemeldet und einen Stern vergeben. Jetzt sieht das Projekt gleich etwas lebendiger aus.
Lust auf mehr? Als Experte für Individualentwicklung mit Ruby on Rails kann ich Sie in Ihren Projekten unterstützen. Melden Sie sich gerne bei mir.
Hinterlassen Sie einen Kommentar