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

时间:2016-05-18 20:41:13

标签: phoenix-framework ecto

我在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

1 个答案:

答案 0 :(得分:2)

如果按照惯例编写,调用changeset函数将会使用Ecto.Changeset.Cast/4处理您正在寻找的投射。

Phoenix / Ecto故意不信任原始用户输入。变更集是" Ecto方式"处理这件事。

这是一种更常规的方式来处理您在控制器中进行的操作:

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