Рендеринг JSON в Фениксе

elixir phoenix-framework

5342 просмотра

2 ответа

62 Репутация автора

Я использовал "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

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

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

Автор: Donavan Stanley Источник Размещён: 17.07.2016 11:17

Ответы (2)


9 плюса

133 Репутация автора

Решение

Я тоже недавно начал с Феникса, но, наверное, я знаю, в чем проблема.

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")}

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

изменения

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

чтобы просто

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

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

Автор: lech1 Размещён: 17.07.2016 11:42

2 плюса

21 Репутация автора

У меня была именно эта проблема сегодня, и это потому, что я произвел множественное имя имени, как в 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
Автор: Julien De Coster Размещён: 17.08.2016 10:27
Вопросы из категории :
32x32