Как создать набор изменений для вложенного ресурса с 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

person Kyle Decot    schedule 18.05.2016    source источник


Ответы (1)


Вызов вашей функции 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
person naserca    schedule 19.05.2016