在 Phoenix Framework 表单中,如何使用变更集将 belongs_to 关系设置回 null?

In a Phoenix Framework form, how can I set a belongs_to relation back to null using a changeset?

在 Phoenix Framework 表单中,我的页面上有一个 select 框,其中有一个选项可以将 belongs_to 值设置为 nil。

<%= select f, :relation_id, 
  Enum.into(Enum.map(@relations, fn p -> {p.name, p.id} end), 
  [{"None", nil}]) %>

表单通常会发送 ID,但是当 selected 为 nil 值时,它会将值作为空字符串传递:

"relation_id" => ""

我从 Ecto 收到一个错误,指出变更集无效,因为它需要一个整数。我可能会拦截地图,将值设置为 null,然后将更新后的地图传递到变更集中。但是有更简单的方法吗?

我认为你应该使用插件 scrub params

尝试添加到您的控制器:

defmodule MyApp.SomeThingController do
  use MyApp.Web, :controller

  plug :scrub_params, "some_thing" when action in [:create, :update]

  # def ....
end

它将 ""(空)值转换为 nil 值。

希望对您有所帮助。