HAML - if / elsif construction - PullRequest
       7

HAML - if / elsif construction

10 голосов
/ 19 марта 2012

Мне нужна эта конструкция в моем коде 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 ]

10 голосов
/ 19 марта 2012

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

- if something1
  -divclass = 'a'
- elsif something2
  -divclass = 'b'
- elsif something3
  -divclass = 'c'
- else
  -divclass = 'd'
%div{:class => divclass}
  %div another content
8 голосов
/ 19 марта 2012

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

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

Действительно ужасный способ сделать это - использовать троичные операторы (condition ? true_case : false_case), что не похоже на хорошее решение, учитывая тот факт, чтоВы выбрали haml и хотите, чтобы ваша база кода была чистой.

0 голосов
/ 09 сентября 2014

Вы можете расширить условие if с помощью этого модуля, а затем использовать условия в стиле smalltalk

  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

...