我在Rails中制作了一个自定义的准CMS,我们希望在代码中有一个可编辑为HTML片段的字段(管理界面将在前端使用CodeMirror)。当它呈现给最终用户时,它将只是html_safe
'并插入到div中。我们相信我们的内容编辑器不会是恶意的,但确保他们创建有效的HTML以便它们不会破坏页面会很有帮助,特别是因为它们对编码来说相对较新!
作为第一次尝试,我正在使用Hash.from_xml
并将异常作为自定义验证程序进行抢救。但是有没有更好的和/或更优化的方式(即一个宝石)来检查它是否是有效的HTML?
谢谢!
答案 0 :(得分:11)
您可以使用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 :(得分:7)
而不是验证,或许值得使用能够修正标记的Nokogiri:
require 'nokogiri'
html = '<div><b>Whoa</i>'
Nokogiri::HTML::DocumentFragment.parse(html).to_html
#=> "<div><b>Whoa</b></div>"
答案 2 :(得分:2)
您可能需要https://github.com/libc/tidy_ffi或http://apidock.com/rails/v4.0.2/HTML/WhiteListSanitizer(类方法sanitize
)
答案 3 :(得分:1)
我认为这可能是您正在寻找的东西?:be_valid_asset。