Phoenix json只返回id

时间:2016-07-23 07:19:23

标签: elixir phoenix-framework

我正在尝试使用生成的html以及json api响应创建Phoenix应用程序。这是我到目前为止所做的:

mix phoenix.gen.html User users name:string email:string
mix phoenix.gen.json Api.User users --no-model

然后我在"别名MyApp.Api.User"中更改了UserController中的别名。 to"别名Api.User"。它的工作原理! ..大多数!

这是我在http响应中得到的:

{"data":[{"id":1},{"id":2}]}

我想解决的问题是 - 当我在Api上拨打GET时,我只会得到一个id列表;没有返回所有其他有用的字段。 IO.inspect告诉我控制器正在返回所有内容。所以它必须是过滤掉字段的视图。

但是,我对Elixir / Phoenix的理解不足。这就是我所看到的:

  def render("index.json", %{users: users}) do
    %{data: render_many(users, MyApp.Api.UserView, "user.json")}
  end

我的基本问题是 - 如何深入了解render_many方法并找出解决这个问题的方法?

我的第二个问题是:

  • 是否有任何好的资源可以让html和json api正常工作 一起在凤凰城?
  • 什么是" user.json"在上面的代码?关于" index.json",我认为它仅用于模式匹配。

2 个答案:

答案 0 :(得分:1)

web/views/api/user_view.ex中应该有以下代码:

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

您只需要添加更多字段:

def render("user.json", %{user: user}) do
  %{id: user.id, name: user.name, email: user.email}
end

def render("user.json", %{user: user}) do
  Map.take(user, [:id, :name, :email])
end

documentation详细解释了Phoenix.View.render_many/4的工作原理。

  

有什么好的资源可以让html和json api在凤凰城一起工作吗?

我不知道。

  

上面代码中的“user.json”是什么?关于“index.json”,我认为它仅用于模式匹配。

是的,该参数由render传递给render_many。请参阅上面的文档链接。

答案 1 :(得分:0)

  

有什么好的资源可以让html和json api在凤凰城一起工作吗?

如果您的html和json使用相同的资源&逻辑,他们可能应该,你可以做到以下几点:

在您看来,定义“.html”和“.json”条款,例如

def render("show.json", %{user: user}) do
  %{...}
end

def render("show.html", %{user: user}) do
  render ...
end

在您的控制器中,更改字符串,例如"show.html",对于没有后缀的原子,例如:show

在路由器中,确保在管道中同时接受htmljson

凤凰应该在请求进入时以相应的格式呈现响应。