2008-10-25 6 views
6

Es ist möglich, Markdown Inhalt mit ungültiger Syntax zu schreiben. Ungültig bedeutet, dass die Bibliothek BlueCloth den Inhalt nicht analysiert und eine Ausnahme auslöst. Der markdown Helper in Rails fängt keine BlueCloth-Exceptions ab, weshalb die gesamte Seite nicht gerendert werden kann (stattdessen wird die 500 Server Error-Seite gerendert).Wie man Markdown validiert?

In meinem Fall dürfen Benutzer Markdown-Inhalt schreiben und in der Datenbank speichern. Wenn jemand eine ungültige Syntax verwendet, schlagen alle nachfolgenden Wiedergabeversuche dieses Inhalts fehl (Statuscode 500 - Interner Serverfehler).

Wie umgehen Sie dieses Problem? Ist es möglich, die Markdown-Syntax auf Model-Ebene zu validieren, bevor sie in der Datenbank gespeichert wird?

+0

Sie vielleicht wissen wollen, dass BlueCloth verschiedene Probleme hat und dass es bessere Markdown-Bibliotheken jetzt: http://tomayko.com/writings/ruby-markdown-libraries-real-cheap-for-you-two-for-price-of-one –

+0

Könnten Sie Ihr Beispiel für ungültigen Abschlag teilen? http://stackoverflow.com/questions/4751032/whats-an-example-of-some-invalid-markdown – Simon

+0

Nebenbei: siehe auch [Babelmark] (http://babelmark.bobtfish.net/) zum Vergleich Ergebnisse anderer Implementierungen. – Arjan

Antwort

9

Sie sollten Ihre eigene Validierungsmethode schreiben, in der Sie das BlueCloth-Objekt initialisieren und versuchen würden, die Methode to_html aufzurufen, um eine Ausnahme abzufangen. Wenn Sie eine Ausnahme abfangen, schlägt die Validierung fehl, andernfalls sollte es in Ordnung sein.

In Ihrem Modell:

protected: 

def validate 
    bc = BlueCloth.new(your_markdown_string_attribute) 
    begin 
    bc.to_html 
    rescue 
    errors.add(:your_markdown_string_attribute, 'has invalid markdown syntax') 
    end 
end 
1

Ich habe ein bisschen recherchiert und entschieden RDiscount statt BlueCloth zu verwenden. RDiscount scheint wesentlich schneller und zuverlässiger zu sein als BlueCloth.

Es ist einfach, RDiscount in Ihre Rails-Umgebung zu integrieren. Fügen Sie die in Ihrem environment.rb snipped folgenden und Sie sind bereit zu gehen:

begin 
    require "rdiscount" 
    BlueCloth = RDiscount 
rescue LoadError 
    # BlueCloth is still the our fallback, 
    # if RDiscount is not available 
    require 'bluecloth' 
end 

(getestet mit Rails 2.2.0)