【问题标题】:Difference between render functions in PhoenixPhoenix 中渲染函数的区别
【发布时间】:2017-04-14 13:11:48
【问题描述】:

我试图了解 Phoenix 中不同的 render 函数之间的区别。具体来说,我注意到 Phoenix 视图和 Phoenix 模板中有几个不同的 render 函数。

例如,在 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

在与此视图(即 UserView)关联的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 %>

这似乎与之前渲染函数的签名不匹配。谁能帮忙解释一下这个渲染来自哪里以及它是如何工作的?

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案1】:

    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
    

    【讨论】:

    • 这篇文章没有回答这个问题,只是链接到文档和来源。 (仔细阅读所有链接的资源确实可以提供答案,而且它们确实可以免费访问,但是本站 95% 的问题都可以通过模板来回答。)
    【解决方案2】:

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

    render "templ.html", opts 版本渲染调用者同一个 View 的模板。这可以从模板中使用来呈现部分。

    Phoenix.View.render App.MyView, "templ.html", opts 用于从不同的视图呈现模板。这就是为什么它从布局模板中调用的原因。

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

    【讨论】:

      猜你喜欢
      • 2012-05-09
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多