如何在Haml中编写if条件语句?

89

如何在 Ruby on Rails 应用程序中使用 Haml 编写 ifif-else 语句?

4个回答

138

HAML是基于缩进的,并且解析器可能会有些棘手。在Haml中,您不需要使用“-end”,而应改用缩进。在Haml中,块始于每次Ruby评估命令后增加缩进的位置,并在缩进减少时结束。示例if else块如下所示。

- if condition
  = something
- else
  = something_else
一个实际例子。
- if current_user
  = link_to 'Logout', logout_path
- else
  = link_to 'Login', login_path

编辑:如果你只想使用if条件语句,那么

 - if current_user
  = link_to 'Logout', logout_path

但是如何仅使用if修饰符? - Thillai Narayanan
只需按照我在答案中编辑的那样使用if语句即可。不需要添加end,缩进会完成其余部分。 - bilash.saha
你实际问题的答案:link_to_if http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to_if - Jeffrey LeCours
我想在if语句内部再加入一个非输出语句,例如:- if current_user - i = 5但是我发现无论怎样缩进都不能正常工作!最后才意识到需要将“-”也进行缩进 :) - msanjay
1
如何在条件语句中添加“或”运算符? - Joe Hany
这个答案让我困惑的是如何在条件语句中只使用一个'='来拥有多行。如果缩进可以实现,那么使用'='似乎没有任何意义。 - PandaWood

20

Haml中有两个运算符用于Ruby代码。

  • = 用于评估并将其插入文档的Ruby代码。

例子:

= form_for @user  
  • -用于Ruby代码的执行,而不是将其插入文档中。

示例:

- if @user.signed_in?  
  = "Hi"  
- else  
  = "Please sign in!"

1
请注意,如果您想输出纯字符串,例如“Hi”或“请登录”,则不需要使用==仅在评估Ruby时才是必需的,例如=“嗨,#{@user.name}” - khustochka

9
在haml中,使用-(破折号)表示该行是Ruby代码。此外,缩进级别表示块级别。将两者结合使用可用于if/else语句。
- if signed_in?
  %li= link_to "Sign out", sign_out_path
- else
  %li= link_to "Sign in", sign_in_path

与ERB中的以下代码相同:

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

2
如果您想在标签内部添加条件
%section{:class => "#{'new-class' if controller.action_name == 'index'}"}

更新

这里有另一种变化。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接