在Phoenix中设置父视图/模板中的属性

时间:2015-07-20 18:24:58

标签: elixir phoenix-framework

我想在凤凰城的子视图/控制器中设置应用程序模板中的title标记。

title代码位于web/templates/layout/app.html.eex模板内,但我有一个ArticlesController呈现给<%= @inner %>来自Rails我使用{{} 1}}通话,但无法在凤凰城找到它的等效物。

将属性从其子项传递到父模板/视图的正确方法是什么?

1 个答案:

答案 0 :(得分:9)

你有几个选择。我假设你想在rails中使用content_for

一种选择是使用render_existing/3 http://hexdocs.pm/phoenix/0.14.0/Phoenix.View.html#render_existing/3

另一种灵活的方法是使用插件:

defmodule MyApp.Plug.PageTitle do

  def init(default), do: default

  def call(conn, opts) do
    assign(conn, :page_title, Keyword.get(opts, :title)
  end

end

然后在你的控制器中你可以做

defmodule FooController do
  use MyApp.Web, :model
  plug MyApp.Plug.PageTitle, title: "Foo Title"
end

defmodule BarController do
  use MyApp.Web, :controller
  plug MyApp.Plug.PageTitle, title: "Bar Title"
end

在你的模板中;

<head>
  <title><%= assigns[:page_title] || "Default Title" %></title>
</head>

我们在这里使用assigns代替@page_title,因为如果未设置值,@page_title将会提升。