Пожалуйста, объясните этот фрагмент кода haml / документация

#ruby-on-rails #ruby #haml

#ruby-on-rails #ruby #haml

Вопрос:

 %div{:class => [@item.type, @item == @sortcol amp;amp; [:sort, @sortdir]] } Contents
  

может отображаться как любой из:

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

Я действительно не понимаю @sortcol amp;amp; [:sort, @sortdir] часть этого фрагмента.

Ответ №1:

Это зависит от приоритета оператора. Итак, он оценивается следующим образом:

  1. @item == @sortcol имеет значение true или false.
    • когда false
      1. amp;amp; возвращает false , потому что другая часть не вычисляется
      2. следовательно, код сводится к :class => [@item.type]
    • когда true
      1. amp;amp; возвращает вторую часть выражения. В этом случае массив [:sort, @sortdir]
      2. HAML автоматически выравнивает массив перед рендерингом, таким образом, это эквивалентно :class => [@item.type, :sort, @sortdir]

Комментарии:

1. Я бы добавил, что, хотя технически код работает, его довольно сложно прочитать. Возможно, было бы лучше перенести его в помощник и дать ему более описательное имя, например sort_order_class

2. Для пояснения, выравнивание массивов может быть разделено пробелами или подчеркиванием. Пробелы, когда это class тип, и подчеркивания, когда это id тип, который сглаживается.

Ответ №2:

 [@item.type, @item == @sortcol amp;amp; [: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
  

Эта конструкция @item == @sortcol amp;amp; [:sort, @sortdir] вернет [:sort, @sortdir], только если @item == @sortcol имеет значение true

Комментарии:

1. Хорошо, я понял. Вывод [:sort, @sortdir] интерпретируется в haml как class поэтому он будет добавлен :sort (как литерал), за которым следует пробел, затем @sortdir (как переменная). Вот как мы в конечном итоге получаем sort ascending or sort descending . Спасибо, что помогли мне понять это.