Ruby on rails 请解释这段haml代码/文档

Ruby on rails 请解释这段haml代码/文档,ruby-on-rails,ruby,haml,Ruby On Rails,Ruby,Haml,可以呈现为以下任意一种: %div{:class => [@item.type, @item == @sortcol && [:sort, @sortdir]] } Contents 内容 目录 目录 目录 我不太理解这个片段的@sortcol&&[:sort,@sortdir]部分 <div class="numeric sort ascending">Contents</div> <div class="numeric">Cont

可以呈现为以下任意一种:

%div{:class => [@item.type, @item == @sortcol && [:sort, @sortdir]] } Contents
内容
目录
目录
目录
我不太理解这个片段的
@sortcol&&[:sort,@sortdir]
部分

<div class="numeric sort ascending">Contents</div>
<div class="numeric">Contents</div>
<div class="sort descending">Contents</div>
<div>Contents</div>

只有当
@item==@sortcol
为true时,此构造
@item==@sortcol&&[:sort,@sortdir]
才会返回[:sort,@sortdir]。

这取决于运算符优先级。因此,其评估如下:

  • @item==@sortcol
    为true或false。
    • false时
    • &&
      返回
      false
      ,因为未对另一部分进行评估
    • 因此,代码减少为
      :class=>[@item.type]
    • true时
    • &&
      返回表达式的第二部分。在本例中,数组
      [:sort,@sortdir]
    • HAML在渲染之前自动展平数组,因此它相当于
      :class=>[@item.type,:sort,@sortdir]

  • 好的,我明白了。
    [:sort,@sortdir]
    的输出在haml中被解释为一个
    ,因此它将附加
    :sort
    (作为文本),后跟一个空格,然后是
    @sortdir
    (作为变量)。这就是我们如何以
    升序排序
    降序排序
    结束的。感谢您帮助我理解这一点。我想补充一点,在技术上使用代码时,阅读这一点非常困难。最好将其移动到助手处,并给它一个更具描述性的名称,例如sort_order_classe要澄清,数组的展平可以用空格或下划线分隔。如果是
    类型,则空格;如果是被展平的
    id
    类型,则下划线。
    [@item.type, @item == @sortcol && [:sort, @sortdir]]
    =>
    # if @item.type is blank, so class is still empty
    # if @item.type is "numeric" class is "numeric"
    class = @item.type
    
    # if @item equal @sortcol
    # class will append "sort" and @sortdir if it is not empty.
    if @item == @sortcol
      class += "sort"
      class += @sortdir
    end