¿Cómo escribir if-condition en Haml?

84

¿Cómo escribir declaraciones ify if- elseen Haml para una aplicación Ruby on Rails?

Thillai Narayanan
fuente

Respuestas:

131

HAML se basa en la sangría y el analizador puede ser complicado. No es necesario utilizar "- end" en Haml. Use sangría en su lugar. En Haml, un bloque comienza siempre que la sangría aumenta después de un comando de evaluación de Ruby. Termina cuando la sangría disminuye. Ejemplo de bloque if else de la siguiente manera.

- if condition
  = something
- else
  = something_else

Un ejemplo practico

- if current_user
  = link_to 'Logout', logout_path
- else
  = link_to 'Login', login_path

Editar: si solo desea usar la condición if, entonces

 - if current_user
  = link_to 'Logout', logout_path
bilash.saha
fuente
Pero cómo usar solo si modificador
Thillai Narayanan
solo use si como he editado en la respuesta.no es necesario que tenga un final.La sangría hará el resto.
bilash.saha
Una respuesta a su pregunta práctica: link_to_if api.rubyonrails.org/classes/ActionView/Helpers/…
Jeffrey LeCours
Quería tener otra declaración sin salida dentro de if like - if current_user - i = 5 y me preguntaba por qué no funcionaba, ¡aunque la he sangrado! Finalmente me di cuenta de que - tiene que ser sangrado :)
msanjay
¿Cómo agregar oroperador a la condición?
Joe Hany
18

En haml se utilizan dos operadores para el código ruby.

  • = se utiliza para el código ruby ​​que se evalúa y se inserta en el documento.

Ejemplo:

= form_for @user  
  • - se utiliza para el código ruby ​​que se evalúa y NO se inserta en el documento.

Ejemplo:

- if @user.signed_in?  
  = "Hi"  
- else  
  = "Please sign in!"
Pratik Ganvir
fuente
1
Tenga en cuenta que realmente no es necesario =si desea generar una cadena simple como Hio Please sign in. =solo es necesario para evaluar Ruby, como= "Hi, #{@user.name}"
khustochka
8

En haml, use el -(guión) para indicar que una línea es código Ruby. Además, el nivel de sangría indica el nivel de bloque. Combine las dos declaraciones de if / else.

- if signed_in?
  %li= link_to "Sign out", sign_out_path
- else
  %li= link_to "Sign in", sign_in_path

es el mismo que el siguiente código en ERB:

<% if signed_in? %>
  <li><%= link_to "Sign out", sign_out_path %></li>
<% else %>
  <li><%= link_to "Sign in", sign_in_path %></li>
<% end %>
Michelle Tilley
fuente
2

Si quieres poner condición dentro de tu etiqueta

%section{:class => "#{'new-class' if controller.action_name == 'index'}"}

ACTUALIZAR

Aquí hay otra variación

%nav(class="navbar"){class: content_for?(:navbar_class) ? yield(:navbar_class) : nil}
Anton Sergeyev
fuente