2012-03-19 7 views
9

necesito esta construcción en mi código HAML:HAML - si/elsif construcción

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

Yo habría esperado que conseguir algo como:

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

Sin embargo, en el hecho de que llegar

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

Cómo debo actualizar mi código, si necesito obtener:

otro contenido

?

+0

no debe ser un guión después de otra ? – alexsuslin

Respuesta

8

creo que se debe crear un método de ayuda en su lugar:

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

La manera muy fea de lograr esto es con los operadores ternarios (condition ? true_case : false_case) que no suena como una buena solución dada por el hecho de que ha seleccionado haml y quiere tener su base de código limpia.

+0

Creo que cuando el OP escriba 'a | b | c | d' quiere decir que quiere a, b, c O d, no todos a la vez, pero su respuesta aún se aplica. – Deleteman

+0

@Deleteman Pensándolo bien, creo que tienes razón. Eliminé la observación ya que no agrega ningún valor. – Candide

+0

@Deleteman tienes razón. ** a ** o ** b ** o ** c ** o ** d **. – user984621

8

@ método de ayuda de Ingenu parece que el enfoque más inteligente, pero si no te importa que sea más rápido y más sucio, que podía hacer:

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

¡Bueno también! Gracias por la idea! – user984621

+0

fyi: si solo quieres incluir una clase en un caso determinado y nada en otros casos, puedes simplemente devolver 'nil' y no se establecerá el atributo, en lugar de establecer' class = "" ' – MMachinegun

0

Usted podría extender su condición con este módulo y luego usar si Smalltalk al estilo de las condiciones

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 

ahora podría codificar cosas como esta:

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

o, si usted es un parche mono travieso ;-):

Object.include IfTrue 

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

si quieres más de una cadena elseif tendrá que adaptar el código de alguna manera factorizar la definición elsif