2017-04-13 54 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例子的回答指出。