找出是否在Elixir Phoenix中创建或更新了子变更集

时间:2019-12-23 09:19:25

标签: elixir phoenix-framework

我有一个正在创建或更新的嵌套模型。您可以将其视为具有多个评论的帖子,仅在这种情况下,它是具有多个警报的设备。为了以正确的方式显示正确的表单,我在父母(设备)模板中使用以下代码:

<%= if @alarm.data.id do %>
        <%= render AppWeb.AlarmView, "form.html", changeset: @alarm, action: Routes.device_alarm_path(@conn, :update,
        @device, @alarm.data.id), message: @last_message %>
 <% else %>
        <%= render AppWeb.AlarmView, "form.html", changeset: @alarm, action: Routes.device_alarm_path(@conn, :create,
        @device), message: @last_message %>
<% end %>
在两种情况下,

@data都是一个变更集。

@alarm.data.id的检查似乎不干净。 @alarm.data永远不会为零,所以我没有遇到运行时错误,但是...我应该如何处理呢?

1 个答案:

答案 0 :(得分:1)

您可以在模板外部处理此问题,例如使用Ecto.Repo.insert_or_update/2方法。它将:state的{​​{1}}字段用于您的变更集,以确定警报Ecto.Schema.Metadata是否已经保留。

因此,您的模板就是:

schema

然后,在您的控制器中,您将具有以下功能:

<%= render AppWeb.AlarmView, "form.html", changeset: @alarm, action: Routes.device_alarm_path(@conn, :create_or_update, @device), message: @last_message %>