Кодирование модели Ecto с помощью Poison: {:invalid, {nil, "voice"}}

Я хочу закодировать две модели, определенные ниже:

web/models/vote.ex

defmodule LetsPlan.Vote do
  use LetsPlan.Web, :model

  alias LetsPlan.Availability
  import LetsPlan.Utils, only: [to_ecto_date: 1]

  @derive {Poison.Encoder, only: [:name, :availabilities]}
  schema "votes" do
    field :name, :string, null: false
    belongs_to :event, LetsPlan.Event
    embeds_many :availabilities, LetsPlan.Availability

    timestamps
  end
end

web/models/availability.ex

defmodule LetsPlan.Availability do
  use LetsPlan.Web, :model

  @derive {Poison.Encoder, only: [:from, :to]}
  embedded_schema do
    field :from, Ecto.Date
    field :to, Ecto.Date
  end
end

Если я использую Poison.encode внутри скрипта и выполните его через iex, он работает нормально:

alias LetsPlan.Repo
alias LetsPlan.Event

# Same code as in the controller
event = Event |> Repo.get(1)
votes = (event |> Repo.preload(:votes)).votes
votes |> Poison.encode |> IO.puts  # {:ok, "..."}

Однако, когда я делаю то же самое в контроллере, он выдает ошибку {:invalid, {nil, "posts"}}, Я действительно не могу понять, в чем разница. Вот соответствующее действие от контроллера:

def create(conn, %{"event_id" => event_id, "vote" => vote_params}) do
  changeset =
    %Vote{}
    |> Vote.changeset(Map.put(vote_params, "event_id", event_id))
  event = Event |> Repo.get!(event_id)

  if changeset.valid? do
    Repo.insert(changeset)
    votes = (event |> Repo.preload(:votes)).votes
    votes |> inspect |> IO.puts

    case Poison.encode votes do
      {:ok, payload} -> Endpoint.broadcast("events:#{event_id}", "new_votes",
                                           payload)
      {:error, reason} -> reason |> inspect |> IO.puts
    end

    conn
    |> put_flash(:info, "Availabilities added.")
    |> redirect(to: event_path(conn, :show, event))
  else
    render conn, "new.html", changeset: changeset, event: event
  end
end

ПРИМЕЧАНИЕ: я не использую Poison 2.1.0, но версию 1.5.2, так как Ecto блокирует его.

0 ответов

Другие вопросы по тегам