質問

無効な構文を使用して Markdown コンテンツを作成することは可能です。無効とは、 BlueCloth ライブラリがコンテンツの解析に失敗し、例外をスローすることを意味します。 Railsの markdown ヘルパーはBlueClothの例外をキャッチしません。そのため、ページ全体がレンダリングに失敗します(代わりに500 Server Errorページがレンダリングされます)。

私の場合、ユーザーはMarkdownコンテンツを書き、データベースに保存することができます。誰かが無効な構文を使用した場合、そのコンテンツの連続したレンダリング試行はすべて失敗します(ステータスコード500-内部サーバーエラー)。

この問題をどのように回避しますか?データベースに保存する前にモデルレベルでMarkdown構文を検証することは可能ですか?

役に立ちましたか?

解決

BlueClothオブジェクトを初期化する独自の検証メソッドを作成し、例外をキャッチする to_html メソッドを呼び出してください。例外をキャッチした場合、検証は失敗します。それ以外の場合は問題ありません。

モデル内:

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

他のヒント

少し調査を行った結果、 RDiscount を使用することにしましたBlueCloth。 RDiscountは、BlueClothよりもはるかに高速で信頼性が高いようです。

RDiscountをRails環境に統合するのは簡単です。次のコードを environment.rb に含めると、準備が整います:

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

(Rails 2.2.0でテスト済み)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top