如何处理Phoenix模板中的“状态”变量

时间:2019-02-28 21:03:24

标签: elixir phoenix-framework

我正在尝试在我的eex模板中执行以下操作:

ffmpeg -i test.mkv -c:v copy -bsf h264_mp4toannexb -f h264 test.h264

这将不起作用,因为无法在理解范围内重新分配外部“ current_production_date”变量。这似乎是一种常见的情况,所以我想有一种简单的方法可以完成此操作...我只是想不通...任何提示都值得赞赏!

3 个答案:

答案 0 :(得分:1)

虽然@Badu的答案在技术上是正确的,但它的[含义]不是完全惯用的Elixir,因为它具有代码重复并且使用[含义]错误的抽象来表示数据的

您所拥有的实际上是一个大块列表,因此您可能需要的是Enum.chunk_while/4

chunk_fun = fn 
  widget, [] ->
    {:cont, [widget]}
  #                  ⇓⇓                                ⇓⇓  PATTERN MATCH!
  %{production_date: pd} = widget, [%{production_date: pd} | _] = prev ->
    {:cont, [widget | prev]}
  widget, acc ->
    {:cont, Enum.reverse(acc), []}
  end
after_fun = fn
  [] -> {:cont, []}
  acc -> {:cont, Enum.reverse(acc), []}
end
widgets = Enum.chunk_while(@widgets, [], chunk_fun, after_fun)

现在在widgets中,您有@widgets,按日期分组。让我们输出它们:

for [%{production_date: date} | _] = chunk <- widgets do
  # output the header with the date
  for widget <- chunk do
    # render the widget
  end
end

我没有测试这段代码,但是它应该可以正常工作。

答案 1 :(得分:0)

您可以使用Enum.reduce/3来累积结果并在之后输出结果。

<% 
current_production_date = nil
{result, _}  = 
Enum.reduce(@widgets, {[], current_production_date}, 
fn %{production_date: production_date} = widget, {acc, current_date} ->
    if product_date != current_date do
      output = "<h1>output a new date header and re-assign current production_date</h1>"
      {[output, Phoenix.View.render_to_string(PageView, "widget.html", widget: widget) 
        |acc], production_date}
    else
        {[Phoenix.View.render_to_string(PageView, "widget.html", widget: widget) |acc], current_date} 
    end
end) %>

<%= for w <- Enum.reverse(result) do %>
    <%= raw(w) %>
<% end %>

答案 2 :(得分:0)

感谢您的建议,最后我得到了一个来自Elixir论坛的建议...使用__getattr__

group_by

我最终将其提取到视图中,因为它直接位于模板中时有点讨厌。