2017-04-13 60 views
1

我想了解鳳凰城不同的render函數之間的區別。具體來說,我注意到Phoenix View和Phoenix模板中有幾個不同的render函數。菲尼克斯渲染函數的區別

例如,鳳凰控制器內,經常可以看到這樣的事情:

# 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 

在這個視圖(即用戶視圖)相關的index.html模板,你可以看到這樣的事情:

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

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

我的理解是,index.html模板中的render函數編譯爲UserView內部的render函數。另外,在iex挖掘後,似乎UserController的索引操作中的render函數來自Phoenix.Controller.render/3

不過,我注意到默認app.html.eex模板文件裏,有一個渲染功能,看起來像這樣:

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

這似乎並不匹配以前的簽名渲染功能。任何人都可以幫助解釋渲染的來源以及它的工作原理嗎?

回答

1

Phoenix.View有一個描述性文檔,如果仍有疑問,手頭上有Phoenix.View.render/3Phoenix.Controller.render/{1,3,4}的源代碼。

從文檔的相關報價:

這種內在的表現讓我們來渲染和輕鬆製作模板。例如,如果你想呈現JSON數據,我們可以通過添加一個「show.json」條目這樣做渲染/ 2,我們認爲:

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

Phoenix.Controller.render/4傳遞的康恩結構,其拾取編寫一些諸如覆蓋佈局,視圖,plash消息,賦值等等的東西。所以,你會在控制器中看到這種方式。

render "templ.html", opts版本呈現調用者相同視圖的模板。這可以從模板中使用來渲染部分。

Phoenix.View.render App.MyView, "templ.html", opts用於從不同視圖呈現模板。這就是爲什麼它從佈局模板中調用的原因。

他們最終都致電App.MyView.render/2。如果你有模板,那麼這些功能將存在。但是你可以在視圖中創建你自己的渲染函數,並按照json例子的回答指出。