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

Mit*_*ins 8 elixir phoenix-framework

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

更新

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

<title><%= @view_module.title(action_name(@conn), assigns) %></title>
Run Code Online (Sandbox Code Playgroud)

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

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"
Run Code Online (Sandbox Code Playgroud)

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

mic*_*ala 28

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

让我们看看它在实践中将如何运作:

# 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
Run Code Online (Sandbox Code Playgroud)

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

  • 在插头中执行此操作会让人感到困惑.插件将存在于控制器或路由器中 - 所以现在设置一个标题,这是一个独家UI的问题,正在整个代码库泄漏.将其保持在视野中,允许将不同的东西分开并且从长远来看更容易维护. (4认同)
  • 考虑将其添加到文档中,因为现在Rails在使用模板包含方面领先许多步骤。非常好的解决方案,值得一提。 (2认同)