Показать конкретную категорию на основе нажатой ссылки |Рубин на рельсах - PullRequest
0 голосов
/ 05 июня 2018

У меня есть блог, который отображает каждую категорию со всеми соответствующими подкатегориями на одной странице.(индексное представление) У меня есть раздел навигации, который я хочу использовать для отображения только сообщений определенной подкатегории на основе нажатой ссылки.Я не знаю, возможно ли это с одним только ruby, поэтому я подумал, что JQuery может быть правильным.

blog_categories index.html.erb:

<%= link_to "BLOG", blog_path %> <!-- Will render latest posts. -->

<li role="presentation" class="dropdown">
  <a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">
    NEWS <span class="caret"></span>
  </a>
  <ul class="dropdown-menu">
    <li role="presentation"><a href="#">All News</a></li> <!-- Will render all subcategories that belong to the "news" category -->
    <li role="presentation"><a href="#">Good News</a></li>
    <li role="presentation"><a href="#">Bad News</a></li>
  </ul>
</li>

<li role="presentation" class="dropdown">
  <a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">
    REVIEWS <span class="caret"></span>
  </a>
  <ul class="dropdown-menu">
    <li role="presentation"><a href="#">All Reviews</a></li>
    <li role="presentation"><a href="#">Software</a></li>
    <li role="presentation"><a href="#">Hardware</a></li>
  </ul>
</li>

<% BlogCategory.top_level.find_each do |category| %>
  <% category.sub_categories.find_each do |sub_category| %>
    <% sub_category.posts.find_each do |post| %>

      <%= link_to post do %>
        ...
      <% end %>

    <% end %>
  <% end %>
<% end %>

Blog_categories_controller:

def index
  @category = BlogCategory.find_by_id(params[:id])
  unless @category.nil? # Allows for categories to have nothing in them, eliminating the NoMethodError
    @sub_category = @category.sub_categories.first
    @posts = @subcategory.posts
  end
end


private

  def cat_params
    params.require(:blog_category).permit(:name, :parent_id, :sub_category)
  end

My sub_categories связаны с основными категориями через столбец parent_id в таблице blog_categories через самоссылочную связь.

Я немного читал об активных запросах записей на guides.rubyonrails.org и видел кое-что о таких условиях, как Client.where("orders_count = ?", params[:orders]) Можно ли это использовать?

Если это неправильный способ использования раскрывающихся списков HTML для итерации по BlogCategory, я хотел бы знать, каким способом лучше всего будет решить эту проблему, спасибо!

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Это решение, которое я нашел подходящим для меня:

Вы можете связать элемент с таблицей (в данном случае с таблицей blog_categories), используя соответствующий id(или slug, если вы их используете) в пути ссылки.

Пример. Подкатегория, на которую вы хотите сослаться, имеет id, равное "1" (или группу "отзывов")Вы можете сделать ссылку на него следующим образом:

С ID: <a href="/blog_category/1">Reviews</a>

С Slug: <a href="/blog/reviews">All Reviews</a>

Это можно сделать для всех ссылок в раскрывающемся списке.:

<li role="presentation" class="dropdown">
  <a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">CATEGORIES <span class="caret"></span></a>
  <ul class="dropdown-menu">
    <!-- without slugs -->
    <li role="presentation"><a href="/blog_categories/1">Reviews</a></li>
    <li role="presentation"><a href="/blog_categories/2">Tutorials</a></li>
    <!-- with slugs -->
    <li role="presentation"><a href="/blog/reviews">Reviews</a></li>
    <li role="presentation"><a href="/blog/tutorials">Tutorials</a></li>
  </ul>
</li>

В основном формат этих ссылок будет <a href="/[table_name]/[table_item]>Link text</a>

0 голосов
/ 11 июня 2018

Глядя на ваш код и вопрос, кажется, что вы хотите показать все категории, их подкатегории и сообщения в каждой подкатегории на странице индекса.Я предполагаю, что у вас есть ограниченное количество постов, иначе вы можете ограничить его количеством п (5?) В каждой подкатегории.Если это так, у вас может быть следующий контроллер:

def index
  @categories = BlogCategory.top_level.includes(sub_categories: :posts)
end

Тогда в представлении вы можете легко получить доступ к @categories, @categories[i].sub_categories и @categories[i].sub_categories[j].posts без каких-либо дополнительных запросов, запускаемых из представления.Что-то в строках:

<% @categories.each do |category| %>
  <li role="presentation" class="dropdown">
  <a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">
    <%= category.name %> <span class="caret"></span>
  </a>
  <ul class="dropdown-menu">
    <% category.sub_categories.each do |sub_category| %>
      <li role="presentation"><a href="#"><%= sub_category.name %></a></li>
      <!-- And if you want to show the posts here, then loop through sub_category.posts -->
    <% end %>
  </ul>
  </li>
<% end %>

Вы можете использовать jquery для отображения и скрытия соответствующих подкатегорий и сообщений в зависимости от того, что пользователь нажимает.Вот пример: http://api.jquery.com/show/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...