Служба Google Maps Direction переходит обратно к источнику (создает цикл), как мне это предотвратить?

Использование render_many / 4 является правильным.

Если вы хотите определить функцию рендеринга role.json в том же модуле, вы можете сделать:

def render("user.json", %{user: user}) do
  %{
    id: user.id,
    name: user.name,
    roles: render_many(user.roles, __MODULE__, "role.json", as: :role)
  }
end

def render("role.json", %{role: role}) do
  %{
    id: role.id
    ... 
  }
end

Обратите внимание, что мы передаем функцию as: :role в функцию render_many. Это связано с тем, что назначение (часть %{role: role}) выводится из имени представления. В этом случае это UserView, поэтому по умолчанию это будет %{user: user}.

Если вы определяете модуль RoleView, вы можете просто переместить функцию def render("role.json") в новый RoleView и вызовите render_many без опции as:

...
roles: render_many(user.roles, MyApp.RoleView, "role.json")
...

Другой вариант, который может быть предпочтительным для вас, - это получить протокол в вашей модели:

defmodule App.Role do
  use App.Web, :model
  @derive {Poison.Encoder, only: [:id, :name]}

  schema "roles" do
    has_many :roles_users, App.RolesUser
    has_many :users, through: [:roles_users, :user]
    field :name, :string
    timestamps
  end

Лично Я чувствую, что эта пара моделирует ваше мнение, поэтому я предпочитаю использовать первый вариант.

-1
задан Bing 15 January 2019 в 18:31
поделиться