Jak napisać warunek warunkowy w Haml?

84

Jak pisać ifi if- elseinstrukcje w Haml dla aplikacji Ruby on Rails?

Thillai Narayanan
źródło

Odpowiedzi:

131

HAML jest oparty na wcięciach, a parser może być trudny. Nie musisz używać "- end" w Haml. Zamiast tego użyj wcięć.W Haml, blok zaczyna się za każdym razem, gdy wcięcie zostanie zwiększone po poleceniu oceny Ruby. Kończy się, gdy wcięcie się zmniejsza. Przykład, jeśli else blokuje w następujący sposób.

- if condition
  = something
- else
  = something_else

Praktyczny przykład

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

Edycja: Jeśli chcesz tylko użyć warunku if, to

 - if current_user
  = link_to 'Logout', logout_path
bilash.saha
źródło
Ale jak używać tylko z modyfikatorem
Thillai Narayanan
po prostu użyj, jeśli tak jak ja redagowałem w odpowiedzi. nie ma potrzeby zakończenia. Wcięcie zrobi resztę.
bilash.saha
Odpowiedź na twoje praktyczne pytanie: link_to_if api.rubyonrails.org/classes/ActionView/Helpers/…
Jeffrey LeCours
Chciałem mieć inną instrukcję niebędącą wyjściem wewnątrz if like - if current_user - i = 5 i zastanawiałem się, dlaczego to nie działa, chociaż wciąłem go! W końcu zdałem sobie sprawę, że - musi być wcięty :)
msanjay
Jak dodać oroperator do warunku?
Joe Hany
18

W hamlu do kodu ruby ​​używane są dwa operatory.

  • = jest używany do kodu ruby, który jest oceniany i wstawiany do dokumentu.

Przykład:

= form_for @user  
  • - jest używany dla kodu ruby, który jest oceniany i NIE jest wstawiany do dokumentu.

Przykład:

- if @user.signed_in?  
  = "Hi"  
- else  
  = "Please sign in!"
Pratik Ganvir
źródło
1
Pamiętaj, że tak naprawdę nie potrzebujesz, =jeśli chcesz wyprowadzić zwykły ciąg, taki jak Hilub Please sign in. =jest konieczne tylko do oceny Rubiego, na przykład= "Hi, #{@user.name}"
khustochka
8

W hamlu użyj -(myślnika), aby wskazać, że wiersz jest kodem Ruby. Ponadto poziom wcięcia wskazuje poziom bloku. Połącz oba dla instrukcji if / else.

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

jest taki sam jak poniższy kod w 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
źródło
2

Jeśli chcesz umieścić stan w swoim tagu

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

AKTUALIZACJA

Oto kolejna odmiana

%nav(class="navbar"){class: content_for?(:navbar_class) ? yield(:navbar_class) : nil}
Anton Sergeyev
źródło