【问题标题】:Phoenix Framework - page titles per routePhoenix Framework - 每条路线的页面标题
【发布时间】:2017-07-10 18:48:45
【问题描述】:

在 Phoenix 框架中,有一种基于路由/路径设置页面标题的常用技术。或者这只是在我的路由函数内的正确位置调用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”(我可能只会在转换时这样做)

【问题讨论】:

  • 我通常只是将title: "The Title" 传递给每个控制器操作的render 调用。如果页面标题基于应用于控制器名称和/或操作名称的某些逻辑,则可以使用插件。

标签: elixir phoenix-framework


【解决方案1】:

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

让我们看看这在实践中是如何工作的:

# 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

由于将模板名称和分配都传递给标题函数,它的工作方式与render/2 完全一样 - 我们可以对模板名称进行模式匹配并可以访问所有分配。我们在所有视图上无条件调用该函数,因此必须在所有视图上定义它 - 我们可以使用function_exported?/3 和一些默认后备标题添加一些额外的检查,但我认为要明确并在每个视图中定义它工作量不大,而且代码更简单。

【讨论】:

  • 考虑将此添加到文档中,因为现在 Rails 在使用模板包含方面领先很多。非常好的解决方案,值得在其他地方注意。
  • 专用的Plug在这里不是更自然吗?我错过了什么吗?
  • 在插件中执行此操作会令人困惑。该插件将存在于控制器或路由器中 - 所以现在设置一个标题,这是一个专门关注 UI 的问题,正在整个代码库中泄漏。保持它在视图中,可以将不同的东西分开,从长远来看更容易维护。
【解决方案2】:

我在尝试“assign @view_module not available in template”时出错。

[更新]

原来新的解决方案是view_module(@conn)view_template(@conn)。例如

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

【讨论】:

    猜你喜欢
    • 2015-07-07
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 2021-06-07
    相关资源
    最近更新 更多