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