【问题标题】:Setting properties in parent view/template in Phoenix在 Phoenix 的父视图/模板中设置属性
【发布时间】:2015-11-09 23:28:28
【问题描述】:

我想在应用程序模板中设置title 标签,来自 Phoenix 的子视图/控制器。

title 标记在 web/templates/layout/app.html.eex 模板内,但我有一个 ArticlesController 渲染到 <%= @inner %> 来自 Rails 我会使用 yield 调用,但找不到它的等价物在凤凰城。

从子级向父级模板/视图传递属性的正确方法是什么?

【问题讨论】:

标签: elixir phoenix-framework


【解决方案1】:

这里有几个选项。我假设您想要在 rails 中使用 content_for 之类的东西。

一种选择是使用render_existing/3http://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 将引发。

【讨论】:

  • 感谢加兹勒!我能够使用您对模板的建议来解决此问题,并将page_title: "a title" 添加到控制器操作中的render 调用中。 ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-10
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多