wmo*_*ock 5 elixir phoenix-framework
我试图了解renderPhoenix 中不同功能之间的区别。具体来说,我注意到renderPhoenix 视图和 Phoenix 模板中有几个不同的功能。
例如,在 Phoenix 控制器中,通常会看到以下内容:
# 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
Run Code Online (Sandbox Code Playgroud)
在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>
Run Code Online (Sandbox Code Playgroud)
我的理解是,render该功能内index.html模板编译成render的函数内UserView。此外,在深入研究之后iex,似乎index 操作中的render函数UserController来自Phoenix.Controller.render/3.
但是,我注意到在默认app.html.eex模板文件中,有一个如下所示的渲染函数:
<%= render @view_module, @view_template, assign %>
Run Code Online (Sandbox Code Playgroud)
这似乎与之前渲染函数的签名不匹配。任何人都可以帮助解释此渲染的来源以及它是如何工作的吗?
Phoenix.View有一个描述性文档,如果仍然有疑问,手头有一个源Phoenix.View.render/3代码Phoenix.Controller.render/{1,3,4}。
文档中的相关引用:
\n\n\n\n这种内部表示使我们能够轻松地渲染和组合模板。例如,如果您想渲染 JSON 数据,我们可以通过在视图中的 render/2 添加 \xe2\x80\x9cshow.json\xe2\x80\x9d 条目来实现:
\n\nRun Code Online (Sandbox Code Playgroud)\ndefmodule YourApp.UserView do\n use YourApp.View \n def render("show.json", %{user: user}) do\n %{name: user.name, address: user.address}\n end\nend\n