#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:
Это зависит от приоритета оператора. Итак, он оценивается следующим образом:
@item == @sortcol
имеет значение true или false.- когда
false
amp;amp;
возвращаетfalse
, потому что другая часть не вычисляется- следовательно, код сводится к
:class => [@item.type]
- когда
true
amp;amp;
возвращает вторую часть выражения. В этом случае массив[:sort, @sortdir]
- 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
orsort descending
. Спасибо, что помогли мне понять это.