我们将使用conn.path_info,它以字符串列表的形式返回当前路径,而不是conn.request_path。我们可以使用它来获取我们的 active_class 助手。
def active_class(conn, path) do
current_path = Path.join(["/" | conn.path_info])
if path == current_path do
"active"
else
nil
end
end
然后我们像这样使用它:
<%= link "Users", to: user_path(@conn, :index), class: active_class(@conn, user_path(@conn, :index))%>
请注意,我们在上面两次user_path/2。我们可以用另一个助手把它干掉:
def active_link(conn, text, opts) do
class = [opts[:class], active_class(conn, opts[:to])]
|> Enum.filter(& &1)
|> Enum.join(" ")
opts = opts
|> Keyword.put(:class, class)
link(text, opts)
end
为什么使用conn.path_info 而不是conn.request_path?这是因为conn.request_path 将返回用户请求的确切路径。如果用户访问路径/foo/,则conn.request_path 将返回/foo/。问题是我们将比较的路由器助手将始终返回路径/foo,而没有尾随/。
希望对您有所帮助!如果有任何不清楚的地方,请告诉我。