elixir - 查看是否在 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
永远不会为零,所以我没有收到运行时错误,但仍然......我应该如何处理这个?
解决方案
您可以在模板之外处理此问题,例如在控制器中使用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
推荐阅读
- vue.js - 如何为带参数的链接设置 nuxt-link 的活动类?
- javascript - 将 SweetAlert2 与 TypeScript 一起使用,找不到模块“sweetalert2/dist/sweetalert2.js”的声明文件
- javascript - 在 SwitchMap 运算符中使用 Promise
- android - 如何执行向上滚动操作,直到找出需要使用 espresso 的元素
- python-3.x - 如何使用 Pandas 按降序排序日期和按升序排序时间
- python - 使用 heredocs 或更好的方法编写 Bash 脚本
- javascript - 收到欢迎信息后触发函数
- android - 如何在 Android 中使用我自己的本机代码使用第三方本机代码?
- javascript - 具有动态值的半圆形进度条
- mysql - 为什么索引会使查询变慢?