【问题标题】:Can Haml omit tags where the Ruby content evaluates to nil?Haml 可以省略 Ruby 内容评估为 nil 的标签吗?
【发布时间】:2014-09-12 08:57:20
【问题描述】:

如果我在 Rails 模板中有一行计算结果为 nil,有没有办法让 Haml 不用费心为该行生成输出而不是创建一个空标签?例如给出这个:

%h4= @my_hash[:optional]

...想象一下该哈希键没有数据。我不想结束:

<h4></h4>

我不希望该行有任何输出,因为空标签仍然会影响页面布局,特别是如果您使用的是像 Bootstrap 这样的 CSS-heavy。

我可以到处写这个:

-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 支持的一些深奥选项时,我真的希望这个功能已经存在于某个地方。

【问题讨论】:

  • 使用-if 是完全可以接受的。它不是冗长或丑陋的;相反,它相当于您在 Ruby 中直接使用尾随“if”执行的操作。

标签: ruby-on-rails ruby haml


【解决方案1】:

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

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

仍然很啰嗦,但至少现在在一条线上。

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

【讨论】:

  • 这不行,它仍然会创建空标签。
【解决方案2】:

试试这个代码

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

【讨论】:

    【解决方案3】:

    尽管这是我的问题,但我想我会建议一个我刚刚想到的半OK-ish 答案,希望有人会看着它并说'啊哈!我可以做得更好。'

    我可以把它放在视图中

    != 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 的未转义 ruby​​ 求值器 '!=',来获得我正在寻找的东西。缺点包括:尽管它在视图中非常简洁,并且易于扩展,但它看起来不像常规的 Haml。另外,我不能 100% 确定如果我大量使用它不会以某种方式让 Haml 感到不安。

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

    【讨论】:

      猜你喜欢
      • 2010-09-21
      • 2015-11-16
      • 1970-01-01
      • 1970-01-01
      • 2013-07-22
      • 2015-02-08
      • 2013-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多