2017-04-13 2 views
1

Ich versuche, den Unterschied zwischen den verschiedenen render Funktionen in Phoenix zu verstehen. Insbesondere bemerke ich, dass es verschiedene render Funktionen in einer Phoenix-Ansicht und einer Phoenix-Vorlage gibt.Unterschied zwischen Render-Funktionen in Phoenix

Zum Beispiel in einem Phoenix-Controller, ist es üblich, so etwas zu sehen:

# assume this is UserController 
def index(conn, _params) do 
    users = Repo.all(Users) # let's assume that this gives you all your users 
    render conn, "index.html", users: users 
end 

In index.html Vorlage mit dieser Ansicht verknüpft ist (dh Userview), können Sie so etwas wie dies sehen:

# index.html 
<ul> 
    <%= for user <- @users do %> 
     <li><%= render "user.html", user: user %></li> 
    <% end %> 
</ul> 

# user.html 
<p><%= @user.name %></p> 

Mein Verständnis ist, dass die render Funktion innerhalb der index.html Vorlage zu einer render Funktion innerhalb der UserView kompiliert wird. Auch nach dem Umgraben in iex scheint es, als ob die render Funktion in der UserController Indexaktion von Phoenix.Controller.render/3 kommt.

aber ich merke, dass der Standard innerhalb von app.html.eex Vorlagendatei, gibt es eine Funktion machen, die wie folgt aussieht:

<%= render @view_module, @view_template, assign %> 

Dies scheint nicht die Unterschriften der vorherigen übereinstimmen Funktionen machen . Kann mir jemand erklären, woher dieser Render stammt und wie er funktioniert?

Antwort

1

Phoenix.View hat eine beschreibende Dokumentation, und wenn noch Zweifel gibt es einen Quellcode für Phoenix.View.render/3 und Phoenix.Controller.render/{1,3,4} auf der Hand.

Das damit verbundene Zitat aus der Dokumentation:

Diese innere Darstellung uns Vorlagen zu machen und komponieren leicht ermöglicht. Zum Beispiel, wenn Sie JSON-Daten machen möchten, können wir dies tun, indem eine „show.json“ Eintrag hinzufügen/2 aus unserer Sicht zu machen:

defmodule YourApp.UserView do 
    use YourApp.View  
    def render("show.json", %{user: user}) do 
    %{name: user.name, address: user.address} 
    end 
end 
1

Die Phoenix.Controller.render/4 übergeben wird das Kommando-Struktur, die nimmt eine Reihe von Dingen wie das Überschreiben des Layouts, die Ansicht, plash Nachrichten, weist usw. auf. So werden Sie sehen, Render so in Controllern genannt.

Die render "templ.html", opts Version rendert die Vorlage der gleichen Ansicht des Aufrufers. Dies kann von einer Vorlage verwendet werden, um eine partielle Darstellung zu rendern.

Die Phoenix.View.render App.MyView, "templ.html", opts wird verwendet, um eine Vorlage aus einer anderen Ansicht zu rendern. Deshalb heißt es so von der Layoutvorlage.

Sie alle enden am Aufruf der App.MyView.render/2. Wenn Sie Vorlagen haben, sind diese Funktionen vorhanden. Sie können jedoch in der Ansicht eine eigene Renderfunktion erstellen und sie aufrufen, wie in der Antwort mit dem Beispiel json gezeigt wurde.

Verwandte Themen