HAML - if / elsif建设

时间:2012-03-19 16:09:55

标签: ruby ruby-on-rails-3 if-statement haml

我在HAML代码中需要这种结构:

- if something1
  %div.a
- elsif something2
  %div.b
- elsif something3
  %div.c
- else
  %div.d
    %div another content

我希望我得到类似的东西:

<div class="a|b|c|d">
  <div>another content</div>
</div>

但事实上我得到了

   <div class="a|b|c|d"></div>
   <div>another content</div>

如果需要,我必须如何更新我的代码:

  另一个内容

3 个答案:

答案 0 :(得分:10)

@ Ingenu的辅助方法看起来更聪明,但如果你不介意它更快更脏,你可以这样做:

- if something1
  -divclass = 'a'
- elsif something2
  -divclass = 'b'
- elsif something3
  -divclass = 'c'
- else
  -divclass = 'd'
%div{:class => divclass}
  %div another content

答案 1 :(得分:8)

我认为你应该创建一个帮助方法:

%div{:class => helper_method(useful_parameters)}

实现这一目标的真正难看的方法是使用三元运算符(condition ? true_case : false_case),这听起来不是一个很好的解决方案,因为您选择了haml并且想要让代码库干净。

答案 2 :(得分:0)

您可以使用此模块扩展if条件,然后使用smalltalk-style条件

  module IfTrue
    def ifTrue &block
      yield if self
      slf=self
      o = Object.new
      def o.elseIf val, &block
         yield if !slf && val
      end
    end
  end

现在你可以编写这样的代码:

  condition.extend(IfTrue).ifTrue{ 
   do_stuff 
  }elseIf(condition2){
    doOtherStuff
  }

或者,如果你是一个顽皮的猴子修补师; - ):

 Object.include IfTrue

 condition.ifTrue{ 
    do_stuff 
 }elseIf(condition2){
    doOtherStuff
 }

如果你想链接多个,如果你不得不通过某种方式调整elsif定义来调整这段代码