HAML:只有在条件为真时创建容器/包装元素

11

很难实现,但我想知道是否有办法做到这样:

%p # ONLY SHOW THIS IF LOCAL VARIABLE show_paras IS TRUE
  = name

换句话说,它总是显示内容,但只有在 (some-condition) 为真时才会将容器包装在其中。


1
这是一个重复的问题:https://dev59.com/IGw05IYBdhLWcg3wcReu - David J.
4个回答

16

你可以使用原始HTML,但这样你就需要在开头和结尾都添加if语句:

- if show_paras
  <p>
= name
- if show_paras
  </p>

假设你不仅仅是在执行= name,你可以使用partial函数:

- if show_paras
  %p= render "my_partial"
- else
  = render "my_partial"

你也可以使用HAML的surround功能(尽管这有点混乱):

- surround(show_paras ? "<p>" : "", show_paras ? "</p>" : "") do
  = name

最后,我可能不会尝试完全省略 p 标签,而是使用 CSS 类来设置两种不同的 p 样式,使其看起来符合我的要求:

%p{:class => show_paras ? "with_paras" : "without_paras"}
  = name

谢谢,Surround正是我在寻找的东西。就像你所说的那样有点凌乱,但是你可以使用一个构建在Surround之上的辅助函数来使它变得非常干净。谢谢! - mahemoff

4

另一个选择是,如果条件不满足,可以使用haml_tag将其包装在替代标签中:

- haml_tag(show_paras ? :p : :div) do
  = name

1
文档 - Martin Tournoij

2

旧版的 haml_tag_if!不错。 - mahemoff
如果我想要向容器添加属性,比如将 href 添加到链接里面,该怎么办? 文档并没有帮我理清思路 :/ https://haml.info/docs/yardoc/Haml/Helpers.html#haml_tag_if-instance_method - xeruf

2
我能想到最简洁的方法是这样的:

= show_paras ? content_tag(:p, name) : name

但这并不完全是HAML。
通常标记是用于内容的,因此如果show_paras是更具表现力的调整,则应该使用CSS来更改%p的行为。

没错,我理解你的观点,但在我的情况下,它涉及到一些条件内容,这使得它在某些情况下可以被认为是段落(或章节等),但在其他情况下只是一个简单的div/span。 - mahemoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接