Snippets im Ruby on Rails CMS Refinery am Beispiel von decidre.com

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_screenshot_biersorte

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"

refinery_create_page_snippet_welcome

Wichtig ist es, diese unsichtbar zu machen über die Option "Display this page in the site menu". Diese muss deaktiviert sein.

refinery_create_page_snippet_welcome2

 

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:

refinery_snippet_page_sitemap

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.

greedog_refinerycms_snippets_github

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.

refinery_snippets

Die Bearbeitung erfolgt exakt wie bei Seiten.

refinery_snippets_create

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.

greedog_refinerycms_snippets_github2

 

 

bjoerne_com_bjoern_weinbrenner_softwareentwickler_icon_leistungen_02

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.

2017-01-28T13:52:37+00:00 28.08.2016|Tags: , |0 Kommentare

Hinterlassen Sie einen Kommentar