Wie schreibe ich if-Bedingung in Haml?

84

Wie schreibe ich ifund if- elseAnweisungen in Haml für eine Ruby on Rails-Anwendung?

Thillai Narayanan
quelle

Antworten:

131

HAML basiert auf Einrückungen, und der Parser kann schwierig sein. Sie müssen "- end" in Haml nicht verwenden. Verwenden Sie stattdessen Einrückung. In Haml beginnt ein Block, wenn die Einrückung nach einem Ruby-Auswertungsbefehl erhöht wird. Es endet, wenn die Einrückung abnimmt. Beispiel, wenn sonst wie folgt blockieren.

- if condition
  = something
- else
  = something_else

Ein praktisches Beispiel

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

Bearbeiten: Wenn Sie nur if-Bedingung verwenden möchten, dann

 - if current_user
  = link_to 'Logout', logout_path
bilash.saha
quelle
Aber wie man nur verwendet, wenn Modifikator
Thillai Narayanan
Verwenden Sie einfach, wenn Sie wie in der Antwort bearbeitet haben. Sie müssen kein Ende haben. Der Einzug erledigt den Rest.
bilash.saha
Eine Antwort auf Ihre praktische Frage: link_to_if api.rubyonrails.org/classes/ActionView/Helpers/…
Jeffrey LeCours
Ich wollte eine weitere Nicht-Ausgabeanweisung im if like - if current_user - i = 5 haben und fragte mich, warum es nicht funktionierte, obwohl ich es eingerückt habe! Endlich wurde klar, dass - eingerückt werden muss :)
msanjay
Wie füge orich der Bedingung einen Operator hinzu?
Joe Hany
18

In haml werden zwei Operatoren für Ruby-Code verwendet.

  • = wird für Ruby-Code verwendet, der ausgewertet und in das Dokument eingefügt wird.

Beispiel:

= form_for @user  
  • - wird für Ruby-Code verwendet, der ausgewertet wird und NICHT in ein Dokument eingefügt wird.

Beispiel:

- if @user.signed_in?  
  = "Hi"  
- else  
  = "Please sign in!"
Pratik Ganvir
quelle
1
Bitte beachten Sie, dass Sie dies nicht wirklich benötigen, =wenn Sie eine einfache Zeichenfolge wie Hioder ausgeben möchten Please sign in. =ist nur für die Bewertung von Ruby erforderlich, wie= "Hi, #{@user.name}"
Khustochka
8

Verwenden Sie in haml den -(Bindestrich), um anzugeben, dass eine Zeile Ruby-Code ist. Darüber hinaus gibt die Einrückungsstufe die Blockstufe an. Kombinieren Sie die beiden für if / else-Anweisungen.

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

entspricht dem folgenden Code in 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
quelle
2

Wenn Sie eine Bedingung in Ihr Tag einfügen möchten

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

AKTUALISIEREN

Hier ist eine andere Variante

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