Phoenix Framework - 每个路线的页面标题

时间:2017-02-21 08:39:54

标签: elixir phoenix-framework

在Phoenix Framework中,有一种基于路径/路径设置页面标题的常用技术。或者这只是在我的路由功能中的正确位置调用assign(:page_title, "fred")的问题?

更新

我最终实现了@ michalmuskala解决方案的变体。我传递了操作名称而不是@view_template

<title><%= @view_module.title(action_name(@conn), assigns) %></title>

然后在视图模块中,代码如下所示:

def title(:show, assigns), do: assigns.user.name <> " (@" <> assigns.user.user_name <> ")"
def title(:edit, _assigns), do: "Edit Profile"
def title(_action, _assigns), do: "User related page"

上面代码中的最后一个语句是模块的可选“catch all”(我可能只会在转换时执行此操作)

1 个答案:

答案 0 :(得分:25)

处理标题的一个好方法是认识到视图是一个像其他模块一样的模块。这意味着您可以在其上定义其他功能。另一方面,在布局中,您可以访问当前视图模块 - 这意味着我们可以调用我们之前定义的函数。

让我们看看它在实践中会起作用:

# The layout template
<title><%= @view_module.title(@view_template, assigns) %></title>

# In some view module
def title("show.html", _assigns) do
  "My awesome page!"
end

感谢将模板名称和赋值传递给title函数,它的工作原理与render/2完全相同 - 我们可以在模板名称上进行模式匹配,并可以访问所有分配。我们无条件地在所有视图上调用函数,因此必须在所有视图上定义 - 我们可以使用function_exported?/3和一些默认的后备标题添加一些额外的检查,但我认为是明确的和定义的它在每个视图中都没有那么多工作,并且可以制作更简单的代码。