我有一个正在创建或更新的嵌套模型。您可以将其视为具有多个评论的帖子,仅在这种情况下,它是具有多个警报的设备。为了以正确的方式显示正确的表单,我在父母(设备)模板中使用以下代码:
<%= 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
永远不会为零,所以我没有遇到运行时错误,但是...我应该如何处理呢?
答案 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 %>