枚举 Elixir 数据,包括嵌套,并在 EEx 中显示键/值?
Enum over Elixir data, including nesting, and display the keys / vals in EEx?
我有一个 Phoenix 应用程序,我需要在其中以 EEx / HTML 显示用户的个人资料,但每个用户的个人资料都有不同的字段,包括嵌套数据。
如果每个用户的个人资料都有相同的字段,这将很简单,因为我可以直接将它们打印到 EEx 中,但由于每个用户都有不同的个人资料,我无法匹配字段。
我正在寻找遍历 User
数据的最佳方法,包括嵌套属性并在 EEx 中逐行显示 Keys/Values。
用户数据如下所示:
[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"]
列出多个用户很容易,因为我可以理解列表并使用 for users <- users do
。我很确定我不能在这种情况下使用它。
您需要递归地遍历用户。您可以为此在视图模块中创建一个函数,这将使您能够在模板中进行递归调用。如果获得地图,它将应用模板,否则仅 return 值(这将结束递归调用)。
# web/views/user_view.ex
def dump_nested(%{} = attributes, fun) do
fun.(attributes, fun)
end
def dump_nested(value, _fun) do
value
end
然后,确保在您的模板中为 value
再次调用 dump_nested
函数,因为这可能包含嵌套映射。请注意,您需要在进行递归调用时向下传递 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 %>
w=10=sh
w=13=will.y.w=12=w
w=11=sh
我的嵌套地图位于嵌套列表中,因此我必须测试并通过列表。这对于理解 Phoenix 的 view/template 过程非常有用 post。
def dump_nested(input, fun) when is_list(input) do
Enum.map(input, fn el -> __MODULE__.dump_nested(el, fun) end)
end
def dump_nested(%{} = attributes, fun) do
fun.(attributes, fun)
end
def dump_nested(value, _fun) do
value
endcode here
我有一个 Phoenix 应用程序,我需要在其中以 EEx / HTML 显示用户的个人资料,但每个用户的个人资料都有不同的字段,包括嵌套数据。
如果每个用户的个人资料都有相同的字段,这将很简单,因为我可以直接将它们打印到 EEx 中,但由于每个用户都有不同的个人资料,我无法匹配字段。
我正在寻找遍历 User
数据的最佳方法,包括嵌套属性并在 EEx 中逐行显示 Keys/Values。
用户数据如下所示:
[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"]
列出多个用户很容易,因为我可以理解列表并使用 for users <- users do
。我很确定我不能在这种情况下使用它。
您需要递归地遍历用户。您可以为此在视图模块中创建一个函数,这将使您能够在模板中进行递归调用。如果获得地图,它将应用模板,否则仅 return 值(这将结束递归调用)。
# web/views/user_view.ex
def dump_nested(%{} = attributes, fun) do
fun.(attributes, fun)
end
def dump_nested(value, _fun) do
value
end
然后,确保在您的模板中为 value
再次调用 dump_nested
函数,因为这可能包含嵌套映射。请注意,您需要在进行递归调用时向下传递 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 %>
我的嵌套地图位于嵌套列表中,因此我必须测试并通过列表。这对于理解 Phoenix 的 view/template 过程非常有用 post。
def dump_nested(input, fun) when is_list(input) do
Enum.map(input, fn el -> __MODULE__.dump_nested(el, fun) end)
end
def dump_nested(%{} = attributes, fun) do
fun.(attributes, fun)
end
def dump_nested(value, _fun) do
value
endcode here