我目前正在寻找在页面处于活动状态时添加CSS类。凤凰目前最好的办法是什么?这个案子有帮助吗?
def active(option, conn) do
if option == conn.request_path do
" class=\"active\""
else
""
end
end
在模板中:
<%= "contact" |> active(@conn) |> raw %>
答案 0 :(得分:19)
我们将使用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, path, opts) do
class = [opts[:class], active_class(conn, path)]
|> Enum.filter(& &1)
|> Enum.join(" ")
opts = opts
|> Keyword.put(:class, class)
|> Keyword.put(:to, path)
link text, opts
end
为什么使用conn.path_info
代替conn.request_path
?这是因为conn.request_path
将返回用户请求的确切路径。如果用户访问路径/foo/
,则conn.request_path
将返回/foo/
。问题是我们将要比较的路由器帮助器将始终返回路径/foo
,而不会跟踪/
。
希望有所帮助!如果有什么不清楚,请告诉我。
答案 1 :(得分:4)
我为此创建了一个帮助器,如下所示:
defmodule LinkHelper
@doc """
Calls `active_link/3` with a class of "active"
"""
def active_link(conn, controllers) do
active_link(conn, controllers, "active")
end
@doc """
Returns the string in the 3rd argument if the expected controller
matches the Phoenix controller that is extracted from conn. If no 3rd
argument is passed in then it defaults to "active".
The 2nd argument can also be an array of controllers that should
return the active class.
"""
def active_link(conn, controllers, class) when is_list(controllers) do
if Enum.member?(controllers, Phoenix.Controller.controller_module(conn)) do
class
else
""
end
end
def active_link(conn, controller, class) do
active_link(conn, [controller], class)
end
end
然后我在def view
web/web.ex
函数中导入它
def view do
...
import LinkHelper
...
end
用法:
<li class="<%= active_link(@conn, PageController)%>"><a href="<%= page_path(@conn, :index) %>">Home</a></li>
<li class="<%= active_link(@conn, [FooController, BarController])%>"><a href="<%= foo_path(@conn, :index) %>">Foo or Bar</a></li>
答案 2 :(得分:0)
以下代码正在与我一起使用,包括参数跟踪:
辅助功能如下:
def active_class(path, conn) do
query_string = cond do
conn.query_string == "" -> ""
true -> "?#{conn.query_string}"
end
if ("#{conn.request_path}#{query_string}" === path) do "active" else "" end
end
并在视图中:
<% important_issues_path = issue_path(@conn, :index, important: true) %>
<%= link "important", to: important_issues_path,
class: "nav-link #{
MyApp.TheHelper.active_class(important_issues_path, @conn)
}"
%>