У меня есть вложенный ресурс в моем приложении 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 · рейтинг 3 · naserca
Вызов вашей функции changeset, если она написана обычным образом, будет обрабатывать приведение, которое вы ищете, используя Ecto.Changeset.Cast/4.
Phoenix/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