2012-03-19 3 views
9

Мне нужна эта конструкция в моем Haml код:HAML - если/ELSIF строительство

- 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> 

Как я должен обновить свой код, если мне нужно получить:

другой контент

?

+0

не должно быть отступа после еще ? – alexsuslin

ответ

8

Я думаю, вы должны создать вспомогательный метод вместо:

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

Действительно некрасиво способ сделать это с тройными операторами (condition ? true_case : false_case), которые не звучат как хорошее решение данного из того, что вы выбрали HAML и хотите, чтобы ваша база кода была чистой.

+0

Я думаю, что когда OP пишет 'a | b | c | d', он означает, что хочет либо a, b, c OR d, но не все из них сразу, но ваш ответ по-прежнему применяется. – Deleteman

+0

@Deleteman С другой стороны, я думаю, что вы правы. Я удалил это замечание, поскольку оно не добавляет никакой ценности. – Candide

+0

@Deleteman вы правы. ** a ** или ** b ** или ** c ** или ** d **. – user984621

8

@ вспомогательный метод Ingenu выглядит как разумный подход, но если вы не возражаете его быстрее и грязнее, вы могли бы сделать:

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

Хороший! Спасибо за идею! – user984621

+0

fyi: если вы хотите включить класс в определенный случай, и ничего в других случаях вы можете просто вернуть 'nil', и атрибут не будет установлен, вместо установки' class = "" ' – MMachinegun

0

Вы могли бы расширить, если условие с этим модулем, а затем использовать 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 
} 

если вы хотите приковать более одного ElseIf вам придется адаптировать этот код каким-то образом факторинге ELSIF определение