Rails *修改* PermitScrubber 默认行为的自定义洗涤器

Rails Custom Scrubber which *modifies* PermitScrubber default behavior

如果使用 Rails::Html::PermitScrubber 并且未指定标签或属性的值,则默认使用 Loofah::HTML5::Scrub 中的合理默认值。但是,一旦您设置标签或属性,它就会选择一个完全不同的代码路径来忽略这些默认值。

我想从 Rails::Html::PermitScrubber 提供的默认功能开始(即未指定 tags/attributes 时),只需进行一些小的更改,但要查看 class 实现似乎我需要基本上复制并重新实现一半的 PermitScrubber 方法才能访问该默认功能。 Loofah::HTML5::Scrub 提供的默认值似乎不是任何现有 Loofah::Scrubber class.

的一部分

那么如何在不重新实现一半 class 的情况下对 Rails::Html::PermitScrubber 的默认操作进行 较小的 更改?这当然是一个非常常见的用例!

我猜你可以直接替换class Rails::Html::PermitScrubber 并覆盖 keep_node? 以获得所需的行为(如果存在标签则不更改代码路径)。

原来keep_node?的代码是

  def keep_node?(node)
    if @tags
      allowed_node?(node)
    else
      Loofah::HTML5::Scrub.allowed_element?(node.name)
    end
  end

可能,这就是您要更新的部分。

或者,如果 subclass 不适合您的情况,您可以 monkey-patch 现有的 class。