首页 > 解决方案 > 查看是否在 elixir phoenix 中创建或更新子变更集

问题描述

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

<%= 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永远不会为零,所以我没有收到运行时错误,但仍然......我应该如何处理这个?

标签: elixirphoenix-framework

解决方案


您可以在模板之外处理此问题,例如在控制器中使用Ecto.Repo.insert_or_update/2方法。它使用变更集的:state字段Ecto.Schema.Metadata来确定警报schema是否已经持续存在。

因此,您的模板将是:

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

然后,在您的 Controller 中,您将拥有以下功能:

def create_or_update(conn, %{"alarm" => alarm}) do
  case Repo.insert_or_update(alarm) do
    {:ok, alarm} -> ... 
    {:error, changeset} -> ...
  end
end

推荐阅读