枚举 Elixir 数据,包括嵌套,并在 EEx 中显示键/值?

Rob*_*son 5 enums elixir phoenix-framework

我有一个 Phoenix 应用程序,需要在 EEx / HTML 中显示用户的个人资料,但每个用户的个人资料都有不同的字段,包括嵌套数据。

如果每个用户的个人资料都具有相同的字段,那么这将很简单,因为我可以将它们直接打印到 EEx 中,但由于每个用户都有不同的个人资料,我无法匹配字段。

我正在寻找循环数据的最佳方法User,包括嵌套属性并在 EEx 中逐行显示键/值。

用户数据如下所示:

[closed: :null, created: "2015-10-10T00:51:11.611Z",
 email: "email@gmail.com",
 id: "user-1234", name: "Rbin",
 profile: %{"something" => 2,
   "laptop" => %{"age" => 2, "price" => "High", "size" => "13",
     "type" => "Macbook", "working" => true}, "silly" => "properties"},
 sessions: %{"type" => "list",
   "url" => "/user-1234/sessions"}, type: "user",
 url: "/users/user-1234", username: "rbin"]
Run Code Online (Sandbox Code Playgroud)

列出多个用户很容易,因为我可以进行列表理解并使用 for users <- users do. 我很确定在这种情况下我不能使用它。

Pat*_*ity 5

您需要递归地迭代用户。您可以为此在视图模块中创建一个函数,这将使您能够在模板内进行递归调用。如果它获得映射,它将应用模板,否则仅返回值(这结束递归调用)。

# web/views/user_view.ex

def dump_nested(%{} = attributes, fun) do
  fun.(attributes, fun)
end

def dump_nested(value, _fun) do
  value
end
Run Code Online (Sandbox Code Playgroud)

然后,在模板中确保dump_nested再次调用 的函数value,因为这可能包含嵌套映射。请注意,您需要fun在进行递归调用时向下传递参数,以便函数dump_nested仍然可以引用模板。

<%= dump_nested user, fn(attributes, fun) -> %>
  <dl>
    <%= for {key, value} <- attributes do %>
      <dt><%= key %></dt>
      <dd><%= dump_nested value, fun %><dd>
    <% end %>
  </dl>
<% end %>
Run Code Online (Sandbox Code Playgroud)

  • 您介意分享一下调整吗?它可能会对阅读本文的其他人有所帮助,我也可能从中学到一些东西:)干杯 (3认同)