Кодирование модели 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 блокирует его.