Вопрос

Можно написать Markdown контент с неверным синтаксисом. Недопустимый означает, что библиотеке BlueCloth не удается проанализировать содержимое и выдает исключение. Помощник markdown в Rails не перехватывает никаких исключений BlueCloth, и из-за этого полная страница не отображается (вместо этого отображается страница 500 Ошибка сервера).

В моем случае пользователям разрешено записывать контент 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