如何在不重复缩进代码的情况下在HAML中执行if/else

Mar*_*arc 16 ruby haml

根据用户是否已登录,我想打印另一种%body标签.

这就是我目前的做法:

- if defined? @user
  %body(data-account="#{@user.account}")
    %h1 Welcome
    -# all my content
- else
  %body
    %h1 Welcome
    -# all my content
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,那里有很多重复的代码.我怎么能消除这个?我已经尝试过以下方法:

- if defined? @user
  %body(data-account="#{@user.account}")
- else
  %body
  %h1 Welcome
  -# all my content
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用,因为HAML将其解释为好像%h1和内容是else语句的一部分,当然它们不是.

关于如何解决这个问题的任何想法?我一直在遇到这个问题,所以我无法想象它没有一个简单的解决方案.

小智 13

我不认为您可以避免缩进问题,因为HAML自动分配"结束"语句的方式,但您可以将if语句推送到body标签本身 -

%body{:data_account => (defined? @user ? @user.account : nil)}
Run Code Online (Sandbox Code Playgroud)

而不是

%body(data-account="#{@user.account}")
Run Code Online (Sandbox Code Playgroud)

不是超级漂亮,但比重复整个街区更难看!


Jed*_*der 12

!!!
 - @user = "jed" #=> stubbing out an instance
%html
  %head
    - string = defined?(@user) ? "#{@user}" : nil #=> for demo only, wrap this in a helper method
    %title{'data-account' => string}
  %body
    =yield
Run Code Online (Sandbox Code Playgroud)