Рендеринг JSON в Phoenix

Я использовал "mix phoenix.gen.json", чтобы сгенерировать код для рендеринга json, что привело к представлению ниже:

defmodule Pghm.SightingsView do    
  use Pghm.Web, :view

  def render("sighting.json", %{sighting: sighting}) do
    %{what: sighting.what,
      lat:  sighting.lat,
      long: sighting.long}
  end

  def render("index.json", %{sightings: sightings}) do
    %{data: render_many(sightings, Pghm.SightingsView, "sighting.json")}
  end

  def render("show.json", %{sighting: sighting}) do
    %{data: render_one(sighting, Pghm.SightingsView, "sighting.json")}
  end
end

Однако, когда я пытаюсь получить доступ к нему, я получаю: «Не удалось отрисовать" visioning.json "для Pghm.SightingsView, определите предложение соответствия для render / 2 или определите шаблон в" web / templates / visionings ". Для этого модуля не было скомпилировано никаких шаблонов. Назначает:

Куда бы я ни посмотрел, это говорит о том, что это должно сработать, но я не получаю любви.


person Donavan Stanley    schedule 17.07.2016    source источник
comment
Можете ли вы показать нам вызываемое действие контроллера?   -  person Harrison Lucas    schedule 18.07.2016


Ответы (2)


Я тоже недавно начал работать с Phoenix, но, наверное, знаю, в чем проблема.

def render("sighting.json", %{sighting: sighting}) do
  %{what: sighting.what,
    lat:  sighting.lat,
    long: sighting.long}
end

В определении этой функции сказано, что она будет работать, только если вы вызовете ее так:

render("sighting.json", %{sighting: some_data})

Но этот код:

%{data: render_many(sightings, Pghm.SightingsView, "sighting.json")}

Передает само наблюдение второму параметру рендеринга, а не обязательному% {прицеливание: прицел}. Таким образом, Elixir не смог найти реализацию рендеринга, которая соответствовала бы заданным параметрам, и вызвала ошибку.

Изменение

def render("sighting.json", %{sighting: sighting}) do

чтобы просто

def render("sighting.json", sighting) do

должен сделать свое дело.

person lech1    schedule 17.07.2016

Сегодня у меня была именно такая проблема, потому что я поставил имя представления во множественном числе, как в Rails.

Согласно комментариям в источнике Phoenix (1), ключ выводится из имени представления.

Коллекция - это любое перечислимое количество структур. Эта функция возвращает отрисованную коллекцию в виде списка: render_many users, UserView, "show.html" примерно эквивалентен:

Enum.map(users, fn user ->
  render(UserView, "show.html", user: user)
end)

Базовый пользователь передается в представление и шаблон как :user, который выводится из имени представления. Имя клавиши в назначаемых может быть изменено с помощью опции :as.

(1) https://github.com/phoenixframework/phoenix/blob/8a6beef9e13f049a8458db25b71fb70afae7673a/lib/phoenix/view.ex#L267

Итак, попробуйте следующее:

defmodule Pghm.SightingView do    
  use Pghm.Web, :view

  def render("sighting.json", %{sighting: sighting}) do
    %{what: sighting.what,
      lat:  sighting.lat,
      long: sighting.long}
  end

  def render("index.json", %{sightings: sightings}) do
    %{data: render_many(sightings, Pghm.SightingView, "sighting.json")}
  end

  def render("show.json", %{sighting: sighting}) do
    %{data: render_one(sighting, Pghm.SightingView, "sighting.json")}
  end
end
person Julien De Coster    schedule 17.08.2016
comment
Другое решение (как указано в документации) - добавить as: :sighting в качестве 4-го параметра при использовании функции render_many/4. - person Dapeng Li; 28.03.2018