Phoenix中渲染函数的区别

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)

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

Ale*_*kin 1

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

\n\n

文档中的相关引用:

\n\n
\n

这种内部表示使我们能够轻松地渲染和组合模板。例如,如果您想渲染 JSON 数据,我们可以通过在视图中的 render/2 添加 \xe2\x80\x9cshow.json\xe2\x80\x9d 条目来实现:

\n\n
defmodule 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
Run Code Online (Sandbox Code Playgroud)\n
\n

  • 这篇文章不回答问题,只是提供文档和来源的链接。(仔细阅读所有链接的资源确实可以提供答案,而且它们确实可以免费访问,但是该网站 95% 的问题都可以通过模板来回答。) (2认同)