在 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
值。
希望对您有所帮助。
在 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
值。
希望对您有所帮助。