如何使用 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
我的 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