在凤凰城渲染JSON

Don*_*ley 5 elixir phoenix-framework

我使用"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
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试访问它时,我收到:无法为Pghm.SightingsView渲染"sighting.json",请为render/2定义匹配子句或在"web/templates/sightings"中定义模板.没有为此模块编译模板.分配:

我看过的每个地方都表明这应该有效,但我没有爱.

小智 9

我最近也和Phoenix一起开始,但可能我知道这是什么问题.

def render("sighting.json", %{sighting: sighting}) do
  %{what: sighting.what,
    lat:  sighting.lat,
    long: sighting.long}
end
Run Code Online (Sandbox Code Playgroud)

这个函数的定义是,只有当你这样调用它时它才会起作用:

render("sighting.json", %{sighting: some_data})
Run Code Online (Sandbox Code Playgroud)

但是这段代码:

%{data: render_many(sightings, Pghm.SightingsView, "sighting.json")}
Run Code Online (Sandbox Code Playgroud)

通过目击本身来渲染第二个参数,而不是所需的%{目击:瞄准}事物.所以Elixir找不到适合给定参数的渲染实现并引发错误.

更改

def render("sighting.json", %{sighting: sighting}) do
Run Code Online (Sandbox Code Playgroud)

只是

def render("sighting.json", sighting) do
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩.