tech::hexagram

personal note for technical issue.

PhoenixのテンプレートではMap |> Enum.eachでイテレートを回した中身が表示されない

ERBと同じように書こうとしたら詰まったのでメモ。

簡単な例で書いてみる。

Ruby

@grouped_users = User.all.group_by(&:group)

とcontrollerで定義しておくと、erbだと以下のようにループを回せる。

<% @grouped_users.each do |group, users| %>
  <!-- 何か処理 -->
  <% users.each do |user| %>
    <!-- 何か処理 -->
  <% end %>
<% end %>

Elixir

NG

@grouped_users =
User
|> Repo.all
|> Enum.group_by(&(&1.group))
<%= @grouped_users |> Enum.each(fn(group, users) -> %>
  <!-- 何か処理 -->
  <%= for user <- users do %>
    <!-- 何か処理 -->
  <% end %>
<%= end) %>

こう書いても、テンプレート上では ok としか出ない。 Enum.each の返り値を表示しようとしているのでこうなっているのだと思われる。

OK

@grouped_users =
User
|> Repo.all
|> Enum.group_by(&(&1.group))
|> Enum.map(fn {key, value} -> {key, value} end)
<%= for {group, users} <- @grouped_users do %>
  <!-- 何か処理 -->
  <%= for user <- users do %>
    <!-- 何か処理 -->
  <% end %>
<% end %>

一度keyword listに変換してあげて、for文で回せば問題なく表示される。