【发布时间】:2017-04-29 20:00:44
【问题描述】:
我有两个模型用户和地址的嵌入式关联,我将它们连接起来是这样的:
defmodule App.Address do
# ...
def changeset(struct, params \\ %{}) do
struct
|> cast(params, [:address, :city])
end
end
当我使用时:
inputs_for :addresses, [append: [App.Address{}]], fn address ->
text_input address, :address, class: ""
end
我输入空数据,它被保存为 nil,我希望有一个解决方案来过滤掉空数据并防止它们被保存,我想出的只是在控制器中使用 Enum.filter 变得丑陋我想:
...
filtered_addresses = Enum.filter(user_params["addresses"], fn {x, map} ->
map.address != "" and map.city != ""
end)
user_params = Map.put(user_params, :addresses, filtered_addresses)
是否有更简洁的方式使用模型验证,或者在控制器中使用更简洁的方式?
【问题讨论】:
-
我认为函数 cast_embed/3 应该接受一个像
:reject_if这样的选项,类似于 rails accepts_nested_attributes_for。我已经发布了question to elixir-ecto mailing list -
@OleksandrAvoyants 这就是
:with选项的意义所在。您指定一个变更集,如果它无效,可以拒绝它。 -
@JustinWood 如果我错了请纠正我,但我认为目前变更集无法拒绝记录。
-
旁注:José Valim uses 显式
|> Enum.reject(& &1 == "")用于几乎相同的任务。 -
@mudasobwa 是的,这是有道理的,这是一个简洁的解决方案。
标签: elixir phoenix-framework ecto