2012-03-19 13 views
9

ho bisogno di questa costruzione nel mio codice HAML:HAML - se/elsif costruzione

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

vorrei aspettato ottengo qualcosa di simile:

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

Ma nel fatto ottengo

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

Come devo aggiornare il mio codice, se ho bisogno di ottenere:

altro contenuto

?

+0

non dovrebbe essere un trattino dopo il resto ? – alexsuslin

risposta

8

Credo che si dovrebbe creare un metodo di supporto invece:

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

Il modo davvero brutto per farlo è con gli operatori ternari (condition ? true_case : false_case) che non suonano come una buona soluzione data dal fatto che è stato selezionato Haml e vuoi avere la tua base di codice pulita.

+0

Penso che quando l'OP scrive 'a | b | c | d' significa che vuole a, b, c OR d, non tutti in una volta, ma la tua risposta è ancora valida. – Deleteman

+0

@Deleteman A pensarci bene penso che tu abbia ragione. Ho rimosso l'osservazione poiché non aggiunge alcun valore. – Candide

+0

@Deleteman hai ragione. ** a ** o ** b ** o ** c ** o ** d **. – user984621

8

@ metodo di supporto del Ingenuo sembra l'approccio più intelligente, ma se non ti dispiace più veloce e più sporco, si poteva fare:

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

Anche quello buono! Grazie per l'idea! – user984621

+0

fyi: se vuoi includere solo una classe in un certo caso e niente in altri casi puoi solo restituire 'nil' e l'attributo non verrà impostato, invece di impostare' class = "" ' – MMachinegun

0

Si potrebbe estendere la vostra se le condizioni con questo modulo e quindi utilizzare Smalltalk condizioni -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 

ora è possibile codificare cose come questa:

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

o, se sei un patcher scimmia cattiva ;-):

Object.include IfTrue 

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

se si vuole catena di più di un elseif si dovrà adattare questo codice in qualche modo la definizione di factoring elsif