#html #ruby-on-rails #ruby
#HTML #ruby-on-rails #ruby
Вопрос:
Я создаю настраиваемую квази-CMS в Rails, и мы хотели бы иметь одно поле, которое можно редактировать как фрагмент HTML в коде (интерфейс администратора будет использовать CodeMirror во внешнем интерфейсе). Когда он будет представлен конечному пользователю, он будет просто html_safe
разделен и вставлен в div. Мы верим, что наши редакторы контента не являются вредоносными, но было бы полезно убедиться, что они создают правильный HTML, чтобы не нарушать работу страницы, тем более что они относительно новички в программировании!
В качестве первой попытки я использую Hash.from_xml
и сохраняю исключения в качестве пользовательского средства проверки. Но есть ли лучший и / или более оптимизированный способ (т. Е. gem) проверить, является ли он допустимым HTML?
Спасибо!
Ответ №1:
Вы можете использовать библиотеку Nokogiri (и gem) для создания средства проверки в вашей модели. Использование Nokogiri для фрагментов не идеально (поэтому вы можете добавить возможность переопределения средства проверки), но оно выявит много очевидных ошибок, которые могут привести к повреждению страницы.
Пример (при условии, что вызывается ваш атрибут / поле модели content
):
validate :invalid_html?
def invalid_html?
doc = Nokogiri::HTML(self.content) do |config|
config.strict
end
if doc.errors.any?
errors.add(:base, "Custom Error Message")
end
end
Комментарии:
1. что такое
:base
? Как действительно добавить сообщения об ошибках с фактическим сообщением об ошибке, которое предоставляет nokogiri?2.
:base
указывает на ошибку для всей модели. Вы также можете пометить ошибку в определенном поле. Если поле является содержимым, следующее могло бы быть лучшеerrors.add(:content, "Custom Error Message")
.3. Если вы хотите добавить ошибки Nokogiri, вы можете обработать
doc.errors
и добавить их любым способом, который вы считаете полезным. Чтобы добавить каждую ошибку в модель, которую вы могли бы сделатьdoc.errors.each { |nokogiri_error| errors.add(:content, nokogiri_error) }
. Я не уверен, как выглядят ошибки Nokogiri и было бы ли это хорошей идеей.
Ответ №2:
Вместо проверки, возможно, стоит использовать Nokogiri, который способен исправлять разметку:
require 'nokogiri'
html = '<div><b>Whoa</i>'
Nokogiri::HTML::DocumentFragment.parse(html).to_html
#=> "<div><b>Whoa</b></div>"
Комментарии:
1. Это кажется идеальным для того, что мы ищем — не знали, что Nokogiri может обрабатывать фрагменты! Кроме того, думая об исправлении разметки, я обнаружил github.com/rgrove/sanitize который построен на этой функциональности Nokogiri и позволяет более детально контролировать, какая разметка разрешена. Спасибо!
2. Существует более короткий синтаксис:
Nokogiri::HTML.fragment(html).to_html
Ответ №3:
Вы, вероятно, хотите https://github.com/libc/tidy_ffi или http://apidock.com/rails/v4.0.2/HTML/WhiteListSanitizer (метод класса sanitize
)
Ответ №4:
Я думаю, это может быть то, что вы ищете?: be_valid_asset .
Комментарии:
1. Кажется, это вызывает внешнюю службу , и я бы предпочел полагаться на что-то внутреннее, но это хорошее начало!