【问题标题】:Is there a way to check if text string is valid HTML in Rails?有没有办法在 Rails 中检查文本字符串是否是有效的 HTML?
【发布时间】:2015-11-24 19:23:39
【问题描述】:

我正在 Rails 4 中编写一个简单的 CMS。我将我的文章作为包含 HTML 代码的文本字符串存储在数据库中(不是必需的)。

无论如何,我需要一个方法在保存之前检查文章的文本是否是有效的 HTML 或 nor(考虑到文章不是完整的 HTML 文档,而是它的一部分,没有 DOCTYPE 和其他东西)。像这样:https://validator.w3.org/#validate_by_input+with_options(“验证 HTML 片段”),但在我的 Rails 应用程序中作为模型的验证方法工作,所以如果我的标记错误,它不应该保存文章并显示错误消息。

有没有 gem 或其他方法可以做到这一点?

【问题讨论】:

  • 也许您应该考虑对内容使用降价...如果这适合您的需求(基本标记、图像等)。它的实现非常简单,并且有一些很好的轻量级 javascript 库可以提供接口。这样您就无需担心有效的 HTML。
  • (这个网站也在用)

标签: html ruby-on-rails ruby validation html-validation


【解决方案1】:

如果你想检查 rails 中某个字段的输入,你可以简单地利用 3 个东西

  1. Rails before_save 回调
  2. 用于检查输入的 JS/Ajax(避免页面重新加载)
  3. 您定义为有效 HTML 的约束

在您的模型中,您可以创建一个方法来检查插入到字段中的文本是否有效。在保存表单之前,它会检查插入的 html 是否符合您对有效 html 的定义。

希望以上内容有所帮助。

【讨论】:

    【解决方案2】:

    所以我想出了如何使用w3c_validators gem 来实现这一点。

    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,只有部分)。

    【讨论】:

    • w3c_validators gem 访问 w3c 外部服务。有没有办法在本地/不依赖服务来做到这一点?
    猜你喜欢
    • 2017-02-20
    • 2014-02-09
    • 2016-09-20
    • 2011-06-03
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    相关资源
    最近更新 更多