Мы будем использовать 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
без завершающего /
.
Надеюсь, это поможет! Дайте мне знать, если что-то неясно.
person
Gjaldon
schedule
23.07.2015