Rails — Отображать меню при нажатии на его основную категорию

#ruby-on-rails

#ruby-on-rails

Вопрос:

У меня есть панель навигации, где я отображаю основную категорию (Мужчины, женщины, Нейтральные) (основная категория — это модель, у которой есть только один атрибут :gender .)

Я определил разные полы следующим образом:

enum gender: [:men, :women, :neutral] в моей модели.

Ожидаемо: При наведении курсора мыши на ссылку «Мужчины» я хочу, чтобы отображалось подменю «Мужчины», то же самое для «Женщин» и «Нейтральных».

Категория — это другая модель, которая имеет атрибуты :gender и :title

 <nav class="navbar navbar-expand-lg navbar-light bg-light">
  <div class="container-fluid">

  <div class="collapse navbar-collapse" id="navbarSupportedContent">
    <ul class="navbar-nav mx-auto">
          <% MainCategory.order('gender ASC').all.each do |main_cat| %>
            <li class="nav-link gender"><%= main_cat.gender %> 
              <div id="categories">
                <ul class="navbar-nav mx-auto">
                   <% Category.where(gender: main_cat.gender).order('title ASC').each do |cat| %>
                     <% if cat.product_with_stock %>
                        <li class="nav-link"><%= link_to  "#{cat.title} ", clients_category_path(cat), class: "nav-link" %></li>  
                     <% end %>
                   <% end %>
                </ul>
              </div>
            <% end %>
          </li>
        </ul>
      </div>
    </nav>
  

Это js-файл, который показывает и скрывает #category div.

 $(document).on('turbolinks:load', function() {
    $(".gender").mouseenter(function(){
      $("#categories").slideDown();
    })

    $("body").click(function() {
      $("#categories").slideUp();
    });

    $("#categories").click(function(e) {
      e.stopPropagation();
    });
});
  

С помощью этого кода я вижу то же самое подменю, если я наведу указатель мыши на мужчин или женщин, или нейтральный…

Как я должен улучшить это, чтобы получить то, что ожидалось?

Ответ №1:

Вам нужно будет указать соответствующий пол для каждого div и открыть его из вашего JS:

 <nav class="navbar navbar-expand-lg navbar-light bg-light">
  <div class="container-fluid">

  <div class="collapse navbar-collapse" id="navbarSupportedContent">
    <ul class="navbar-nav mx-auto">
          <% MainCategory.order('gender ASC').all.each do |main_cat| %>
            <li class="nav-link gender" data-gender="<%= main_cat.gender %>"><%= main_cat.gender %> 
              <div class="categories" data-gender="<%= main_cat.gender %>">
                <ul class="navbar-nav mx-auto">
                   <% Category.where(gender: main_cat.gender).order('title ASC').each do |cat| %>
                     <% if cat.product_with_stock %>
                        <li class="nav-link"><%= link_to  "#{cat.title} ", clients_category_path(cat), class: "nav-link" %></li>  
                     <% end %>
                   <% end %>
                </ul>
              </div>
            <% end %>
          </li>
        </ul>
      </div>
    </nav>
  

JS:

 $(document).on('turbolinks:load', function() {
  $(".gender").mouseenter(function(){
    var gender = $(this).data("gender")
    $(".categories[data-gender="   gender   "]").slideDown();
  })

  $("body").click(function() {
    $(".categories").each(function() { $(this).slideUp() })
  });

  $(".categories").click(function(e) {
    e.stopPropagation();
  });
});
  

Я не могу это протестировать, но это должно сработать

Комментарии:

1. Супер ! это работает хорошо, я просто изменил ` $ («#categories[data-gender=» пол «]»).slideDown(); to $ («.categories [data-gender=» пол «]»).slideDown();`

2. @johan Да, виноват; не заметил этого! Рад, что это помогло 🙂