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


arrow_upward
3
arrow_downward

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