Haml可以省略Ruby内容评估为nil的标签吗?

时间:2014-07-21 18:27:01

标签: ruby-on-rails ruby haml

如果我在Rails模板中有一行评估为nil,是否有办法让Haml不费心为该行生成输出而不是创建一个空标记?比如说:

%h4= @my_hash[:optional]

...想象一下这个哈希键没有数据。我不想最终:

<h4></h4>

我希望该行没有任何输出,因为空标记仍然可以影响页面布局,特别是如果你使用像Bootstrap这样像CSS这样的东西。

我可以随处写这个:

-if @my_hash[:optional]
  %h4= @my_hash[:optional]

但它啰嗦而丑陋。

(似乎有很多人会想要这样做,但我找不到任何提及在Haml文档中做到这一点的方法,或者在SO或其他地方询问如何做到这一点的人。所以显然除了我以外,每个人都已经知道怎么做了,对吗?)


更新:感谢您的建议。问题是,你在这里的等号之后放的东西似乎并不重要:

%h4= amazing_intelligent_helper_method_but_sadly_too_late()               

因为Haml已经决定在那时输出标签,唯一的问题是标签中的内容是什么?如果等号后的表达式求值为nil,则Haml不会在标记中添加任何内容 - 但它仍会输出标记本身。

%h4= nil                   #output: <h4></h4>
%h4= ''                    #output: <h4></h4>
%h4= false                 #unexpected output: <h4>false</h4> 
%h4=                       #Haml::SyntaxError 'There's no Ruby code for = to evaluate.'

所以目前,我没有一种省略空标签的方法。但是我肯定不是唯一想要这样做的人吗?当你看到Haml支持的一些深奥的选项时,我真的希望这个功能已经存在于某个地方。

3 个答案:

答案 0 :(得分:1)

只需将条件附加到行ala Ruby语句修饰符:

%h4= @my_hash[:optional] if @my_hash[:optional]

仍然很长时间,但现在至少在一条线上。

以下是其他一些讨论过的技巧,但它们并不简短或更漂亮:HAML: Create container/wrapper element only if condition is true

答案 1 :(得分:0)

试试此代码

 %h4= @my_hash[:optional] unless @my_hash[:optional].blank?

答案 2 :(得分:0)

即使这是我的问题,我还以为我会提出一个半正常的答案我只是想到了希望有人会看到它然后说“啊哈!”我可以做得更好。&#39;

我可以把它放在视图中

!= h4_if @my_hash[:options]

我把它放在我的帮助文件中:

TAGS_TO_DELETE_WHEN_EMPTY = ['h1', 'h2', 'h3', 'h4', 'p', 'span']

TAGS_TO_DELETE_WHEN_EMPTY.each do |tag|
  new_method_name = (tag + '_if').to_sym
  define_method new_method_name do |content = nil| 
    "<#{tag}>#{content}</#{tag}" if content
  end
end

然后我只得到一个h4标签,如果它的内容。我可以使用这些小条件助手方法,加上Haml的非转义红宝石评估器&#39;!=&#39;来获得我正在寻找的东西。缺点包括:虽然它在视图中非常简洁,并且易于扩展,但它看起来并不像常规的Haml。另外,如果我使用大部分内容,我并不是100%肯定它不会以某种方式扰乱Haml。

另外,我仍然希望有人会告诉我Haml的选项是不输出空标签,因为那时我根本不需要编写任何其他代码(这是我的最喜欢的问题解决方案)。