【问题标题】:Ruby gem to quickly validate partial HTML snippets?Ruby gem 快速验证部分 HTML 片段?
【发布时间】:2014-06-24 20:48:54
【问题描述】:

我正在 Rails 中制作一个定制的准 CMS,我们希望有一个可编辑为代码中的 HTML 片段的字段(管理界面将在前端使用 CodeMirror)。当它呈现给最终用户时,它将只是 html_safe'd 并插入到一个 div 中。我们相信我们的内容编辑器没有恶意,但确保他们创建有效的 HTML 以确保他们不会破坏页面会很有帮助,尤其是因为他们是相对较新的编码人员!

作为第一次尝试,我使用Hash.from_xml 并拯救异常作为自定义验证器。但是是否有更好和/或更优化的方法(即 gem)来检查它是否是有效的 HTML?

谢谢!

【问题讨论】:

    标签: html ruby-on-rails ruby


    【解决方案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
    

    【讨论】:

    • 什么是:base?如何使用 nokogiri 提供的实际错误消息真正添加错误消息?
    • :base 表示针对整个模型的错误。您还可以针对特定字段标记错误。如果该字段是内容,则以下内容实际上可能会更好errors.add(:content, "Custom Error Message")
    • 如果您想添加 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>"
    

    【讨论】:

    • 这似乎非常适合我们正在寻找的东西 - 不知道 Nokogiri 可以处理碎片!此外,在考虑修复标记时,我发现github.com/rgrove/sanitize 是基于此 Nokogiri 功能构建的,并且允许更细粒度地控制允许的标记类型。谢谢!
    • 语法更短:Nokogiri::HTML.fragment(html).to_html
    【解决方案3】:

    【讨论】:

      【解决方案4】:

      我想这可能就是您要找的东西?:be_valid_asset

      【讨论】:

      猜你喜欢
      • 2011-07-05
      • 1970-01-01
      • 2015-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多