Menu category cached by Rails, How to use stimulus to activate css class ?? Thanks!
I’m having to guess what you’re trying to accomplish.
…but, assuming Rails has the information regarding what menu should be active, and you want to add a css class to that element so it’s formatted as the active element:
If you’re rendering the category via erb, you could do something like:
<div data-target=“.menuCategory”><%= <rails_class>.active_category_id %></div>
… set the target in your controller:
static targets = ["menuCategory’];
…and then in your controller’s connect element, get the information passed and add the active class to it:
const activeCategory = this.menuCategoryTarget.innerText(); document.querySelector("#"+ActiveCategory).classList.add('<my active css class>');
Hello @nikolaokonesh, we ran into the same issue a few months ago.
Feel free to adapt it to your needs. Here are the steps:
- Store information about your current page, in our case is
App.controller = Users
. - Set the value for which the link is marked as
active
, in our link attributesdata-highlight-sidebar-active-on="Users"
- Check if the current page makes the link active.
We had to make a few improvements to make them enabled on multiple cases stored as a JSON array. In addition we added some animations with Velocity.
Cheers,
Jeremy.
Caching Rails does not give such an opportunity…
I do no see the issue as connect
is called at every navigation and should highlight the correct class.
Be sure to not cache the current page though. In my code I have this at the beginning of the body:
<body>
<script>
App.controller = "<%= controller_name %>.<%= action_name %>"
</script>
...
</body>
The sidebar is cached, and not rendered with a Turbolinks permanent tag so it is not replaced. The active
class is responsive to changes of the App.controller
at each page change.
So good! Thanks everyone!
with rails
<script>
Appcontroller = "<%= request.original_fullpath %>"
</script>
_category.html.erb
<% cache category do %>
<%= link_to category_path(category), data: {"controller" => "activelink", "activelink-active-on" => "#{category_path(category)}"} do %>
<%= sanitize(strip_tags(category.title)) %>
<% end %>
<% end %>