Мы будем использовать 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
без заднего /
.
Надеюсь, что это поможет! Дайте мне знать, если что-то неясно.
Это кажется хорошим выбором для интеграции в систему Controller. Некоторые проблемы с вашим примером кода. 'defmodule LinkHelper do' и' import LinkHelper' – rockerBOO
@rockerBOO хорошее место - должно быть, забыл обновить импорт, когда я его скопировал! – Gazler
Разве этот подход не устанавливает ссылку на «активную» для всех действий контроллера, которые вы передаете ему? Например, 'page_path (@conn,: index)' и 'page_path (@conn,: show)' оба будут установлены как активные, если вы передадите 'PageController' в' active_link/3'. Разве мы не хотим, чтобы страница показа была «активной», только если мы находимся на странице. Show? – Gjaldon