我想用efirate_key相关的两个模型(事件和活动)渲染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 Render Action启用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
我在做什么错?
最好的问候
solded添加为:: castive to render_many这样的shis:
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", as: :activity))
end