查看是否正在 elixir phoenix 中创建或更新子变更集
Find out if child changeset is being created or updated in elixir phoenix
我有一个正在创建或更新的嵌套模型。您可以将其视为具有多个注释的 post,只是在这种情况下它是一个具有多个警报的设备。为了通过正确的操作显示正确的表单,我在我的父(设备)模板中使用了以下代码:
<%= 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
永远不会为零,所以我没有收到运行时错误,但仍然......我应该如何处理这个?
您可以在模板之外处理此问题,例如在您的控制器中使用 Ecto.Repo.insert_or_update/2 方法。它使用您的变更集 Ecto.Schema.Metadata
的 :state
字段来确定警报 schema
是否已被保留。
因此,您的模板将只是:
<%= render AppWeb.AlarmView, "form.html", changeset: @alarm, action: Routes.device_alarm_path(@conn, :create_or_update, @device), message: @last_message %>
然后,在您的控制器中,您将拥有此功能:
def create_or_update(conn, %{"alarm" => alarm}) do
case Repo.insert_or_update(alarm) do
{:ok, alarm} -> ...
{:error, changeset} -> ...
end
end
我有一个正在创建或更新的嵌套模型。您可以将其视为具有多个注释的 post,只是在这种情况下它是一个具有多个警报的设备。为了通过正确的操作显示正确的表单,我在我的父(设备)模板中使用了以下代码:
<%= 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
永远不会为零,所以我没有收到运行时错误,但仍然......我应该如何处理这个?
您可以在模板之外处理此问题,例如在您的控制器中使用 Ecto.Repo.insert_or_update/2 方法。它使用您的变更集 Ecto.Schema.Metadata
的 :state
字段来确定警报 schema
是否已被保留。
因此,您的模板将只是:
<%= render AppWeb.AlarmView, "form.html", changeset: @alarm, action: Routes.device_alarm_path(@conn, :create_or_update, @device), message: @last_message %>
然后,在您的控制器中,您将拥有此功能:
def create_or_update(conn, %{"alarm" => alarm}) do
case Repo.insert_or_update(alarm) do
{:ok, alarm} -> ...
{:error, changeset} -> ...
end
end