使用 HAML 在段落内应用 class

Apply a class inside paragraph with HAML

我在使用 HAML 的 Rails 模板上遇到 Ruby 问题。

我不知道如何在标签内应用特定的 class,例如:

%p My name is John Doe

我想在 "name" 字词中添加 .highlight class。这该怎么做?我只知道这样:

%p
    %span My
    %span.highlight name
    %span is John Doe

但这当然不是最好的方法,我希望如此。有什么想法吗?

无论如何,您必须将突出显示的文本放在它自己的元素中,所以您的代码非常接近。不过,您不需要将其余文本包装在元素中:

%p
  My
  %span.highlight name
  is John Doe

这将产生:

<p>
  My
  <span class="highlight">name</span>
  is John Doe
</p>

编辑:

问号的情况下,可以使用Haml的succeed辅助方法:

%p
  = succeed "?" do
    What's your
    %span.highlight name

这将呈现:

<p>
  What's your
  <span class='highlight'>name</span>?
</p>

还有 precedesurround 方法,您可以在这里阅读:http://haml.info/docs/yardoc/file.REFERENCE.html#helper-methods

如果您更愿意使用字符串插值,定义您自己的辅助方法可能是最简单的方法。

def hl(str)
  capture_haml {
    haml_tag 'span.highlight', escape_once(str)
  }.strip!.html_safe
end

由于这有点复杂,所以让我从内到外分解一下。首先,我们需要用 escape_once 转义字符串。这仅在 str 来自用户输入时才有必要(因此可能导致 XSS 攻击),但在任何情况下都很好。然后我们使用 haml_tag 来渲染 span.highlight 中的字符串。然后我们必须使用 capture_haml 将此输出捕获为字符串,因为我们在插值中使用它(通常 haml_tag 写入 Haml 缓冲区而不是返回字符串)。然后我们使用 strip! 因为 Haml 将在这之后呈现一个换行符,而你说你不想要那个。最后,我们使用 html_safe 告诉 Rails 不要转义输出,因为它会破坏我们的 <span> 并且我们已经转义了输入所以我们知道它是安全的。

现在您可以在插值 Ruby 中使用 hl 方法:

%p
  What's your #{hl "name"}?

这将呈现:

<p>
  What's your <span class='highlight'>name</span>?
</p>