text/markdown zu antworten, so wie er bereits mit JSON antworten kann.
Was dieses Tutorial behandelt
- Antworten auf eine
.md-Anfrage mittext/markdown. - Die Methode
to_markdown, die der Renderer auf Ihrem Objekt erwartet. - Das Rendern von Markdown als HTML – eine eigene Aufgabe für ein eigenes Gem.
Voraussetzungen
Mit Markdown antworten
Fügen Sie demrespond_to-Block der Action ein md-Format hinzu:
format.md reagiert auf eine Anfrage mit der Erweiterung .md. render markdown: ist der neue Renderer.
to_markdown definieren
Der Renderer ruftto_markdown auf allem auf, was Sie ihm übergeben. Ohne diese Methode schlägt die Anfrage mit undefined method 'to_markdown' fehl.
Liegt das Markdown bereits in einem Attribut vor, delegieren Sie daran:
/posts/3.md liefert jetzt das rohe Markdown zurück, mit einem Content-Type von text/markdown; charset=utf-8.
Dieser Header ist der Kern der Funktion. Jeder Client, der Content-Negotiation nutzt, erhält Markdown von Ihrer Anwendung jetzt als vollwertige Repräsentation. Er bekommt nicht länger HTML, das er erst bereinigen muss.
Markdown als HTML rendern
Um Markdown im Browser anzuzeigen, benötigen Sie weiterhin einen Markdown-Parser.commonmarker ist eine sinnvolle Standardwahl und unterstützt GitHub-flavored Markdown.
Der Grund für dieses Feature
Der Auslöser sind Sprachmodelle. Markdown ist das Format, in das Dokumente umgewandelt werden, bevor sie einem Modell als Kontext übergeben werden. Eine Anwendung, dietext/markdown direkt ausliefert, erspart jedem Client die Arbeit, HTML wieder in etwas Nutzbares zurückzuparsen.
Aus demselben Grund ist auch die Dokumentation von AppSignal als Markdown verfügbar. Jede Seite hier wird unter ihrer URL mit der Erweiterung .md als reines Markdown ausgeliefert. Jede Seite in der Navigation ist zudem in llms.txt indexiert. Ein Agent, der diese Dokumentation liest, erhält den reinen Text, nicht das Seiten-Beiwerk. Wenn Sie format.md zu Ihrer eigenen Anwendung hinzufügen, wird sie für Agenten auf dieselbe Weise lesbar.
Wie Sie einem Agenten Zugriff auf Ihre eigenen Monitoring-Daten geben, erfahren Sie unter AppSignal für KI-Agenten.
Markdown-Antworten überwachen
Achten Sie auf zwei Dinge, sobald Ihre Anwendung mit Markdown arbeitet:- Rendering-Kosten. Die Umwandlung von Markdown in HTML bei jeder Anfrage ist echte Arbeit, und sie findet innerhalb des Views statt. Die Performance-Traces von AppSignal teilen eine Anfrage in Events auf. Ein langsames Rendern erscheint als eigenes Segment, nicht als unerklärte Zeit. Stellt sich das Parsen als spürbar heraus, cachen Sie das HTML statt des Markdowns.
- Traffic von Agenten. Markdown-Endpunkte werden meist von Tools angefragt statt von Browsern. Ihr Traffic-Muster unterscheidet sich: stoßweise und oft stark repetitiv. Geben Sie dem Format einen eigenen Aktionsnamen oder Tag, um diesen Traffic von Ihren HTML-Anfragen trennbar zu halten. So verzerrt keiner die Antwortzeiten des anderen.
Transkript
Aus dem Video transkribiert und leicht bearbeitet. Die automatischen Untertitel haben mehrere Produkt- und API-Namen falsch erkannt, diese wurden korrigiert.Transkript lesen
Transkript lesen
0:02 Hallo zusammen, in dieser Episode geht es um den neuen Markdown-MIME-Typ und -Renderer in Rails 8.1: wie er funktioniert und wie Sie ihn in Ihren Rails-Apps einsetzen. Ich habe hier eine ganz einfache Rails-App mit einem Scaffold für Posts. Sie haben einen Titel und einen Body. Wir schreiben etwas wie Hello World, und wir verwenden hier Markdown und schreiben etwa GoRails, https, gorails.com, is awesome. Wir schreiben also ein bisschen Markdown dort hinein, und lassen es uns rendern.0:35 Aber das ist nur eine Zeichenkette, Markdown ist nur Text, und wir müssen das in der UI mit richtigem HTML anzeigen können. Diese neue Funktion in Rails 8.1 dient jedoch nicht dazu, in HTML zu rendern. Sie dient tatsächlich dazu, Markdown als MIME-Typ und Response-Typ in Ihren Views auszuliefern. Um das also richtig darzustellen, verwenden wir ein Gem namens Commonmarker, das im Grunde Ihren Markdown-Text nehmen, in HTML umwandeln und ausgeben kann. Ich habe dieses Gem schon installiert, aber Sie können es zu Ihrer Gemfile hinzufügen und mit bundle installieren.1:14 Dann wechseln wir in unseren View, gehen zu der Stelle, an der der Post-Body gerendert wird, und rufen Commonmarker.to_html auf, geben ihm den Inhalt, und markieren ihn danach als html_safe. Es gibt hier auch noch eine ganze Reihe von Optionen, die Sie in der Commonmarker-Dokumentation nachschlagen können, aber wir verwenden hier die Standardeinstellungen. Wir aktualisieren unsere Seite, und jetzt sehen wir GoRails is awesome, wobei GoRails der Link aus dem Markdown ist und awesome kursiv dargestellt wird, weil das Markdown das in ein Anchor-Tag und ein EM-Tag umgewandelt hat. Das funktioniert also wie erwartet. Die Rails-8.1-Funktion von Markdown als MIME-Typ und Renderer bezieht sich aber eigentlich auf den Renderer in Ihren Controllern.2:02 Wenn wir also eine Action wie diese haben, in der wir mit HTML oder der JSON-Version davon antworten können, können wir jetzt format.md schreiben. Das sucht nach der Dateierweiterung .md in der URL, und dann können wir render markdown schreiben, das ist der Markdown-Renderer. Dieses .md ist also die Abkürzung für den MIME-Typ. Dann haben wir ein render markdown, und wir können ihm den Post übergeben. Wenn wir das im Browser ausprobieren und 3.md aufrufen, bekommen wir einen internen Serverfehler, und zwar einen Aufruf einer undefinierten Methode für eine Instanz von Post.2:41 Was hier passiert, ist im Grunde, dass der Markdown-Renderer versucht, to_markdown auf unserem Modell aufzurufen, und wir das dann an das Attribut body delegieren können, in dem unser Markdown-Text steht. Aktualisieren wir im Browser, bekommen wir hier den rohen Markdown-Inhalt, wie erwartet. Öffnen wir den Netzwerk-Tab im Browser und aktualisieren, sehen wir diese Anfrage, und der Content-Type ist text/markdown mit dem Zeichensatz UTF-8. Das ist also der MIME-Typ, der für den Content-Type unserer Antwort ausgegeben wird. Und das ist im Zeitalter der KI nützlich: Wie DHH erwähnt, ist Markdown das, was wir unseren LLMs geben, damit sie das lesen und als Kontext in Ihrer Anfrage nutzen können.3:32 Das ist also sehr nützlich dafür, aber es rendert Markdown eigentlich nicht in HTML. Und da kommt etwas wie Commonmarker ins Spiel. Das verwende ich inzwischen so gut wie überall. Es hat eine ganze Reihe von Optionen, viele der gleichen GitHub-flavored-Markdown-Funktionen, und es funktioniert wirklich gut. Und damit können wir es tatsächlich als HTML im Browser rendern.3:59 Jetzt haben wir also den MIME-Typ format.md registriert, ebenso wie den Markdown-Renderer. Und alles, was wir tun müssen, ist diese to_markdown-Methode zu definieren. Und schon sind wir fertig. Jeder unserer Views kann jetzt mit Markdown als Content-Type antworten. Das ist schon ziemlich cool.4:20 Das ist wirklich alles dazu. Das ist keine große Funktion. Ich weiß, dass viele Leute total begeistert davon waren. Ich glaube, viele haben angenommen, es wäre so etwas wie Commonmarker, das zu Rails hinzugefügt wird, aber das ist es nicht – es ist tatsächlich nur der Content-Type, der MIME-Typ und der Renderer, und das ist glaube ich der verwirrende Teil.4:37 Der Renderer bedeutet nur, dass der render-Helper versteht: Ja, dieser MIME-Typ soll losgehen und diesen Inhalt zurückgeben. Das ist also wirklich alles dazu. Es gibt hier nicht besonders viel zu besprechen, aber das ist alles, was Sie in Ihren Modellen tun müssen, damit sie als Markdown gerendert werden. Das ist schon ziemlich cool.