4
我想呈現與兩個模型(事件和活動)跨越foreign_key相關的JSON。菲尼克斯JSON加入和預加載數據
在控制器,我執行這個查詢:
def all_nested(conn, %{"event_id" => id}) do
event = Repo.get! nested_all_query, id
render(conn, "show_all.json", event: event)
end
defp nested_all_query do
from event in Event,
left_join: activities in assoc(event, :activities),
preload: [activities: activities]
end
當我嘗試IEX控制檯上查詢,查詢返回正確的結果,它具有活動的「活動」數組中。
然後,渲染的時候,我有鑑於這樣的代碼:
def render("show_all.json", %{event: event}) do
render_one(event, Project.EventView, "event_all.json")
end
def render("event.json", %{event: event}) do
%{id: event.id,
name: event.name,
description: event.description,
num_participants: event.num_participants,
minimum_age: event.minimum_age,
price: event.price,
date_start: event.date_start,
date_end: event.date_end,
reg_date_open: event.reg_date_open,
reg_date_close: event.reg_date_close,
rules: event.rules}
end
def render("event_all.json", %{event: event}) do
render("event.json", %{event: event})
|> Map.put_new(:activities, render_many(event.activities, Project.ActivityView, "activity.json"))
end
我打電話render_many的活動得到ActivityView渲染渲染動作(單獨爲這個動作正常工作)JSON。
有了這個代碼,我有這樣的錯誤:
[error] #PID<0.575.0> running Project.Endpoint terminated
Server: localhost:4000 (http)
Request: GET /api/events/1/all
** (exit) an exception was raised:
** (Poison.EncodeError) unable to encode value: {nil, "activities"}
(poison) lib/poison/encoder.ex:354: Poison.Encoder.Any.encode/2
(poison) lib/poison/encoder.ex:213: anonymous fn/4 in Poison.Encoder.Map.encode/3
(poison) lib/poison/encoder.ex:214: Poison.Encoder.Map."-encode/3-lists^foldl/2-0-"/3
(poison) lib/poison/encoder.ex:214: Poison.Encoder.Map.encode/3
(poison) lib/poison/encoder.ex:213: anonymous fn/4 in Poison.Encoder.Map.encode/3
(poison) lib/poison/encoder.ex:214: Poison.Encoder.Map."-encode/3-lists^foldl/2-0-"/3
(poison) lib/poison/encoder.ex:214: Poison.Encoder.Map.encode/3
(poison) lib/poison/encoder.ex:232: anonymous fn/3 in Poison.Encoder.List.encode/3
(poison) lib/poison/encoder.ex:233: Poison.Encoder.List."-encode/3-lists^foldr/2-1-"/3
(poison) lib/poison/encoder.ex:233: Poison.Encoder.List.encode/3
(poison) lib/poison/encoder.ex:213: anonymous fn/4 in Poison.Encoder.Map.encode/3
(poison) lib/poison/encoder.ex:214: Poison.Encoder.Map."-encode/3-lists^foldl/2-0-"/3
(poison) lib/poison/encoder.ex:214: Poison.Encoder.Map.encode/3
(poison) lib/poison.ex:41: Poison.encode!/2
(phoenix) lib/phoenix/controller.ex:642: Phoenix.Controller.do_render/4
(project) web/controllers/event_controller.ex:1: Project.EventController.action/2
(project) web/controllers/event_controller.ex:1: Project.EventController.phoenix_controller_pipeline/2
(project) lib/project/endpoint.ex:1: Project.Endpoint.instrument/4
(project) lib/phoenix/router.ex:261: Project.Router.dispatch/2
(project) web/router.ex:1: Project.Router.do_call/2
我在做什麼錯?
問候