2016-07-23 84 views
0

我想創建一個鳳凰應用程序生成的HTML以及JSON API響應。這是我迄今所做的:鳳凰城json只返回ID

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

然後,我從「別名MyApp.Api.User」到「別名Api.User」改變了別名UserController的。它的工作原理!主要是!

這是我得到的HTTP響應:

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

我想解決的問題是 - 當我打電話GET的API,我只是得到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」,我認爲它只用於模式匹配。

回答

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」,我認爲它只用於模式匹配。

是的,該參數傳遞給renderrender_many。請參閱上面的文檔鏈接。

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

在你的路由器,請確保您接受您的管道

和菲尼克斯應該呈現在按照格式回覆都htmljson當請求進來,

+0

在這種情況下,控制器必須知道不管請求的資源是html還是json,都可能從連接對象中讀取。另一個問題是 - 默認的html和json API控制器是不同的。 json api控制器將狀態碼添加到響應中,而html控制器不會這樣做。 – Puneet

+0

對於期望html的請求,狀態代碼並不重要。 @ user246615 – prM