有没有办法检查 Rails 中的文本字符串是否有效 HTML?
Is there a way to check if text string is valid HTML in Rails?
我正在 Rails 4 中编写一个简单的 CMS。我将我的文章作为包含 HTML 代码(不需要)的文本字符串存储在数据库中。
无论如何,我需要一种方法来在保存之前检查文章的文本是否有效HTML或也不正确(考虑到文章不是完整的HTML文档,而是部分它,没有 DOCTYPE 和其他东西)。像这样:https://validator.w3.org/#validate_by_input+with_options ("Validate HTML fragment"),但是在我的 Rails 应用程序中作为模型的验证方法工作,所以如果我的标记是错误的,它不应该保存文章并显示而是错误消息。
有gem或其他方法吗?
如果您要检查 rails 中某个字段的输入,您可以简单地利用 3 个东西,它们是
- Railsbefore_save回调
- JS/Ajax 用于检查输入(避免页面重新加载)
- 您定义为有效的约束条件HTML
在您的模型中,您可以创建一个方法来检查插入到字段中的文本是否有效。在保存表单之前,它会检查插入的 html 是否符合您对有效 html 的定义。
希望以上内容对您有所帮助。
所以我想出了如何使用 w3c_validators
gem 来实现这一点。
- 将
gem 'w3c_validators'
添加到 Gemfile 和 运行 bundle install
。
更换型号。我添加了自定义验证方法来验证 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,只有部分)。
我正在 Rails 4 中编写一个简单的 CMS。我将我的文章作为包含 HTML 代码(不需要)的文本字符串存储在数据库中。
无论如何,我需要一种方法来在保存之前检查文章的文本是否有效HTML或也不正确(考虑到文章不是完整的HTML文档,而是部分它,没有 DOCTYPE 和其他东西)。像这样:https://validator.w3.org/#validate_by_input+with_options ("Validate HTML fragment"),但是在我的 Rails 应用程序中作为模型的验证方法工作,所以如果我的标记是错误的,它不应该保存文章并显示而是错误消息。
有gem或其他方法吗?
如果您要检查 rails 中某个字段的输入,您可以简单地利用 3 个东西,它们是
- Railsbefore_save回调
- JS/Ajax 用于检查输入(避免页面重新加载)
- 您定义为有效的约束条件HTML
在您的模型中,您可以创建一个方法来检查插入到字段中的文本是否有效。在保存表单之前,它会检查插入的 html 是否符合您对有效 html 的定义。
希望以上内容对您有所帮助。
所以我想出了如何使用 w3c_validators
gem 来实现这一点。
- 将
gem 'w3c_validators'
添加到 Gemfile 和 运行bundle install
。 更换型号。我添加了自定义验证方法来验证 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,只有部分)。