我试图理解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 %>
这似乎与之前渲染函数的签名不匹配。任何人都可以帮助解释这个渲染的来源以及它是如何工作的吗?
答案 0 :(得分:2)
Phoenix.View
有一个描述性文档,如果仍有疑问,我们手边有Phoenix.View.render/3
和Phoenix.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示例的答案中的指示调用它。