Есть ли способ проверить, является ли текстовая строка допустимым HTML в Rails?

Я пишу простую CMS в Rails 4. И я храню свои статьи в базе данных в виде текстовых строк, содержащих HTML-код (не обязательно).

В любом случае, мне нужен метод, чтобы проверить перед сохранением, является ли текст статьи допустимым HTML или ни (учитывая, что статья не является полным документом HTML, а является его частью, без DOCTYPE и прочего). Примерно так: https://validator.w3.org/ ("Проверка фрагмента HTML"), но работа внутри моего приложения Rails как метод проверки модели, поэтому, если моя разметка неверна, ее не следует сохранять статью и показать сообщение об ошибке вместо.

Есть ли драгоценный камень или другой способ сделать это?

2 ответа

Решение

Поэтому я понял, как этого добиться, используя w3c_validators драгоценный камень.

  1. добавлять gem 'w3c_validators' в Gemfile и запустить bundle install,
  2. Сменить модель. Я добавил пользовательский метод проверки для проверки HTML, например:

    class Article < ActiveRecord::Base
        validate :valid_html
    
        def valid_html
          @validator = MarkupValidator.new
    
          html = "<!DOCTYPE html><html><head><title>title</title></head><body>#{text}</body></html>"
    
          results = @validator.validate_text(html)
    
          if results.errors.length > 0
            results.errors.each do |err|
              errors.add(:text, err.to_s)
            end
          end
        end
      end
    

(Мне нужно обернуть мой код в теги HTML и BODY и добавить еще несколько тегов, потому что я не храню полный HTML в моей БД, только частичные).

Если вы хотите проверить ввод для поля в рельсах, вы можете просто использовать 3 вещи, которые

  1. Rails before_save обратный вызов
  2. JS/Ajax для проверки ввода (избегайте перезагрузки страницы)
  3. Ограничения, в которых вы определяете, чтобы быть действительным HTML

В вашей модели вы можете создать метод, в котором проверяется, является ли текст, вставленный в поле, действительным. Перед сохранением формы проверяется, соответствует ли вставленный HTML вашему определению действительного HTML.

Надеюсь, что выше помогает.

Другие вопросы по тегам