如何使用 Ecto/Phoenix 为嵌套资源创建变更集

How to create changeset for nested resource w/ Ecto/Phoenix

我的 Phoenix 应用程序中有一个嵌套资源,我正尝试为其创建一个变更集。问题是 Ecto.build_assoc 期望映射具有原子键,但我的参数具有字符串键。为嵌套资源创建变更集的正确方法是什么?

def create(conn, %{"component" => component_params}, generator) do
  changeset = Ecto.build_assoc(generator, :components, component_params) # attributes don't get set
  ...
end

调用您的 changeset 函数,如果按照惯例编写,将使用 Ecto.Changeset.Cast/4.

处理您正在寻找的转换

Phoenix/Ecto 故意不信任原始用户输入。变更集是处理此问题的 "Ecto way"。

这是一种更传统的方法来处理您在控制器中进行的操作:

def create(conn, %{"component" => component_params}, generator) do
  changeset =
    generator
    |> Ecto.build_assoc(:components)
    |> Component.changeset(component_params)
  ...
end

鉴于您在 component.ex 中有类似的内容:

def changeset(model, params \ :empty) do
  model
  |> cast(params, @required_fields, @optional_fields)
end