凤凰城渲染功能的区别

时间:2017-04-13 03:20:06

标签: elixir phoenix-framework

我试图理解Phoenix中不同render函数之间的区别。具体来说,我注意到凤凰视图和凤凰模板中有几个不同的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模板(即UserView)中,您可以看到如下内容:

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

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

我的理解是render模板中的index.html函数被编译为render内的UserView函数。此外,在iex中挖掘后,render索引操作中的UserController函数似乎来自Phoenix.Controller.render/3

但是,我注意到在默认的app.html.eex模板文件中,有一个如下所示的渲染函数:

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

这似乎与之前渲染函数的签名不匹配。任何人都可以帮助解释这个渲染的来源以及它是如何工作的吗?

2 个答案:

答案 0 :(得分:2)

Phoenix.View有一个描述性文档,如果仍有疑问,我们手边有Phoenix.View.render/3Phoenix.Controller.render/{1,3,4}的源代码。

文件中的相关引用:

  

这种内在表示允许我们轻松地渲染和撰写模板。例如,如果要渲染JSON数据,我们可以通过在视图中向render / 2添加“show.json”条目来实现:

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

答案 1 :(得分:1)

Phoenix.Controller.render/4传递了conn结构,它接受了一些事情,例如覆盖布局,视图,plash消息,分配等等。因此,您将在控制器中看到以这种方式调用的渲染。

render "templ.html", opts版本呈现调用方的同一视图的模板。这可以从模板中使用以呈现部分。

Phoenix.View.render App.MyView, "templ.html", opts用于从其他视图呈现模板。这就是它从布局模板中调用的方式。

他们最终都打电话给App.MyView.render/2。如果您有模板,那么这些功能将存在。但是您可以在视图中创建自己的渲染函数,并按照json示例的答案中的指示调用它。