rails 5.x:为'sanitize'

时间:2018-02-25 19:37:01

标签: ruby-on-rails ruby-on-rails-5

我正在开发一个Rails应用程序,其HAML模板经常使用名为sanitize的例程。我从上下文中推断出这个例程可以清理用户控制的HTML。例如:

# views/feed_items/_about.html.haml
%h3 Summary:
.description
  = sanitize @feed_item.description

我想让这个例程将'rel = nofollow'添加到所有出站链接,除了它已经在做的事情。最简单的方法是什么?

N.B。我没有运气找到这种方法的定义,或者它的官方配置旋钮。供应商目录中有两个不同的HTML清洁剂宝石,我甚至无法弄清楚正在使用哪一个。这是一个庞大而复杂的Web应用程序,我没有写,我几乎不了解Ruby,更不用说Rails的所有扩展了。请假设我不知道您认为显而易见的任何事情。

2 个答案:

答案 0 :(得分:1)

如果存在rel标签,消毒器将去除它们。

我遇到了类似的问题,并在clean_links模块中添加了一个附加的辅助方法-ApplicationHelper,并在对内容进行消毒后对其进行了命名。

# application_helper.rb
def clean_links html
  html.gsub!(/\<a href=["'](.*?)["']\>(.*?)\<\/a\>/mi, '<a href="\1" rel="nofollow">\2</a>')
  html.html_safe
end

此方法查找所有<a>标签,并添加rel =“ nofollow”。 html_safe方法是必需的,否则HTML将显示为字符串(已被清理)。

此解决方案将所有链接均等对待,因此,如果您只希望指向域外的链接,则必须相应地更新REGEX。

您认为:<%= clean_links sanitize(@something) %>

因此,首先要清理内容,然后在显示链接之前添加rel =“ nofollow”标签。

答案 1 :(得分:0)

实际上有一种内置方式:

sanitize "your input", scrubber: Loofah::Scrubbers::NoFollow.new