2016-07-23 6 views
0

Ich versuche, eine Phoenix-Anwendung mit generierten HTML-sowie JSON API Antworten zu erstellen. Dies ist, was ich bisher getan haben:Phoenix json gibt nur IDs

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

Dann änderte ich den Alias ​​in Usercontroller von „alias MyApp.Api.User“ bis „alias Api.User“. Und es funktioniert! .. naja meistens!

Dies ist, was ich in HTTP-Antwort erhalten:

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

Das Problem, das ich zu beheben versuche ist - wenn ich auf der Api GET rufen, bekomme ich nur eine Liste von IDs; Alle anderen nützlichen Felder werden nicht zurückgegeben. IO.inspect sagt mir, dass der Controller alles zurückgibt. Es muss also die Ansicht sein, die Felder ausfiltert.

Allerdings ist mein Verständnis von Elixir/Phoenix hier zu kurz. Das ist, was ich sehe:

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

Meine grundlegende Frage - Wie kann ich in render_many Methode tauchen und herauszufinden, was dies zu beheben geschieht?

Meine sekundären Fragen sind:

  • Gibt es eine gute Ressource html und json api arbeiten zusammen in Phoenix zu bekommen?
  • Was ist "user.json" im obigen Code? In Bezug auf "index.json" denke ich, dass es nur für die Mustererkennung verwendet wird.

Antwort

1

Es sollte der folgende Code in web/views/api/user_view.ex sein:

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

Sie müssen nur mehr Felder hinzufügen, dass:

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

oder

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

Die documentation erklärt wie Phoenix.View.render_many/4 arbeitet im Detail.

Gibt es eine gute Ressource, um HTML zu bekommen und Json API arbeitet in Phoenix zusammen?

Mir sind keine bekannt.

Was ist "user.json" im obigen Code? In Bezug auf "index.json" denke ich, dass es nur für die Mustererkennung verwendet wird.

Ja, dieser Parameter wird an render von render_many übergeben. Siehe oben den Link zur Dokumentation.

0

Gibt es eine gute Ressource, um HTML zu bekommen und Json Api arbeitet zusammen in Phoenix?

Wenn Ihr HTML und json die & Logik gleiche Ressource verwenden, und sie wahrscheinlich sollte, können Sie folgendes tun:

Ihrer Ansicht definieren beide „.html“ und „.json“ Klauseln, z.B

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

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

Ändern Sie in Ihrem Controller die Zeichenfolge, z. "show.html" an ein Atom ohne das Suffix, z.B. :show

In Ihrem Router, stellen Sie sicher, dass Sie sowohl html und json in Ihrer Pipeline wird die Antworten im entsprechenden Format machen

und Phoenix übernehmen sollte, wenn Anfragen kommen.

+0

In diesem Fall Controller wissen müssen ob die angeforderte Ressource html oder json ist, die möglicherweise vom Verbindungsobjekt gelesen werden kann. Das andere Problem ist - die Standard-HTML-und JSON API-Controller sind unterschiedlich. Der JSON-API-Controller fügt der Antwort einen Statuscode hinzu, während der HTML-Controller dies nicht tut. – Puneet

+0

Der Statuscode ist nicht so wichtig für Anfragen, die HTML erwarten. @ user246615 – prM