Phoenix渲染JSON具有加入和预加载数据



我想用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

最新更新