現在、ページがアクティブな場合に CSS クラスを追加しようとしています。現在 Phoenix でこれを行う最適な方法は何ですか? この場合のヘルパーはありますか?
def active(option, conn) do
if option == conn.request_path do
" class=\"active\""
else
""
end
end
テンプレート内:
<%= "contact" |> active(@conn) |> raw %>
ベストアンサー1
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))%>
上記を 2 回実行していることに注意してくださいuser_path/2
。別のヘルパーを使用してこれを DRY 化できます。
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
末尾の のないパスを返すことです/
。
お役に立てれば幸いです。不明な点があればお知らせください。