Как проверить уценку?
-
04-07-2019 - |
Вопрос
Можно написать 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)