在凤凰城渲染JSON

时间:2016-07-17 23:17:31

标签: elixir phoenix-framework

我使用“mix phoenix.gen.json”生成渲染json的代码,结果如下所示:

(5,4,6,8)

然而,当我尝试访问它时,我收到:无法为Pghm.SightingsView呈现“sighting.json”,请为render / 2定义匹配子句或在“web / templates / sightings”中定义模板。没有为此模块编译模板。 分配:

我看到的任何地方都表明这应该有效,但我没有爱。

2 个答案:

答案 0 :(得分:9)

我最近也和凤凰城一起开始,但可能我知道这是什么问题。

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

应该这样做。

答案 1 :(得分:2)

我今天遇到了这个问题,这是因为我将视图的名称复数化,就像在Rails中一样。

根据凤凰源(1)中的评论,密钥是从视图名称推断出来的。

  

集合是任何可枚举的结构。此函数返回   列表中呈现的集合:         function all_fonts_loaded(callback) { return all_fonts_loaded_promise.then(callback); // ^^^^^^ ^^^^ }    大致相当于:

render_many users, UserView, "show.html"
  

基础用户将作为Enum.map(users, fn user -> render(UserView, "show.html", user: user) end) 传递给视图和模板,这是从视图名称推断出来的。可以使用:user选项

自定义分配中的键名称

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

所以试试这个:

:as