Использовать Integer.is_even(количество) в шаблоне

#elixir #phoenix-framework

#эликсир #phoenix-framework

Вопрос:

Я настраиваю phx.gen.html шаблон для использования TailwindCSS. В :show шаблоне я использую этот код:

 <%= for {{k, _}, counter} <- Enum.with_index(schema.attrs) do %>
  <% bg_color = if Integer.is_even(counter), do: "bg-gray-50", else: "bg-white" %>
  <div class="<%= bg_color %>">
    [...]
  </div>
<% end %>
 

Запуск генератора приводит к появлению этого сообщения об ошибке:

 ** (CompileError) ./priv/templates/tailwind.gen.html/show.html.eex:10: 
you must require Integer before invoking the macro Integer.is_even/1
    (elixir 1.11.2) expanding macro: Kernel.if/2
    ./priv/templates/tailwind.gen.html/show.html.eex:10: (file)
 

В Integer.is_even(counter) том-то и проблема.

  • Как я могу требовать Integer здесь?
  • Есть ли лучший / более простой / чистый способ итерации значения bg_color между «bg-gray-50» и «bg-white»?

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

1. <% require Integer %> в любом show.html.eex месте перед вызовом. Кроме того, rem(counter, 2) == 0 это простая функция.

Ответ №1:

Я не очень хорошо знаком с tailwindcss, но обычно это можно сделать исключительно с помощью CSS.

Мне кажется, что tailwindcss поддерживает «четный дочерний» вариант.

Так что я бы предположил, что после небольшой настройки вашей конфигурации tailwind вы могли бы просто присвоить всем своим divs один и тот же класс (я считаю, что дочерние индексы CSS начинаются с 1, поэтому я переворачиваю то, что «четно»):

 <%= for {k, _} <- schema.attrs do %>
  <div class="bg-gray-50 even:bg-white">
    [...]
  </div>
<% end %>
 

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

1. Это интересный взгляд на проблему. Спасибо!

Ответ №2:

 <% require Integer %>
<%= for {{k, _}, counter} <- Enum.with_index(schema.attrs) do %>
  <% bg_color = if Integer.is_even(counter), do: "bg-gray-50", else: "bg-white" %>
  <div class="<%= bg_color %>">
    [...]
  </div>
<% end %>
 

Спасибо @aleksei-matiushkin