Хлебные крошки (breadcrumb) на Ruby on Rails

Здравствуйте. Сегодня мы рассмотрим один из самых простых вариантов реализации хлебных крошек. Конечно, реализация в плане оптимизации не самая лучшая, но она лучше всего показывает смысл работы алгоритма. Он будет хорошо понятен для начинающих, а...

Автор . Дата: 28.10.2014

Здравствуйте. Сегодня мы рассмотрим один из самых простых вариантов реализации хлебных крошек. Конечно, реализация в плане оптимизации не самая лучшая, но она лучше всего показывает смысл работы алгоритма. Он будет хорошо понятен для начинающих, а в следующей статье мы рассмотрим реализацию на геме. Итак, наше ТЗ: предположим, что у нас есть блог, в котором огромное множество категорий, и некоторые вложены друг в друга. Создадим миграцию для модели Category:

class CreateCategories < ActiveRecord::Migration
  def change
    create_table :categories do |t|
      t.integer :parent_id, :default => 0
      t.string :title, :limit => 100, :null => false, :unique => true
      t.timestamps
    end
  end
end

В нашей модели parent_id это id родительской категории. Категории которые не имеют родителей будут иметь id равный 0. В описание модели добавим возможность получить доступ к родительской категории:

belongs_to :parent, :class_name => 'Category', :foreign_key => 'parent_id'

Теперь мы можем получить доступ к родительской категории используя конструкцию вида category.parent. Так же создадим модель записи блока, модель записи для удобства назовем Blog. Допустим, что нам нужно выводить хлебные крошки при отображении записи блога. Создадим экшен show и добавим в него следующий код:

 

 def show
    @blog = Blog.find(params[:id])
    @breadcrums = [@blog.category]
    i = 0
    loop do
      break if @breadcrums[i].parent.nil?
      @breadcrums[@breadcrums.size] = @breadcrums[i].parent
      i+=1
    end
  end

Принцип работы алгоритма очень простой: мы создаем массив @breadcrums и в самую первую ячейку кладем родительскую категорию записи блога. Зачем мы начинаем цикл, в котором получаем первую запись (при первой итерации), смотрим её родителя и кладем на ячейку выше. Затем повторяем цикл, но на этот раз получаем самую последнюю запись в массиве и смотрим её родителя. И так до тех пор, пока не дойдем до корневой категории, у которой нет никаких родителей.

Вот мы и получили массив с нашими хлебными крошками. Но это только пол дела, теперь его ещё нужно отобразить.

В удобном для вас месте размещаем следующий код:

<ol class="breadcrumb">
  <% i = @breadcrums.size %>
  <% loop do %>
    <% break if i == 0 %>
    <% i -= 1 %>
    <li><%= link_to @breadcrums[i].title, category_path(@breadcrums[i]) %></li>
  <% end %>
  <li class="active"><%= @blog.title %></li>
</ol>

В этом отрывке кода мы так же циклично обходим массив с хлебными крошками, но с конца, ведь самая верхняя запись у нас находится в конце. И последней хлебной крошкой добавляем саму запись. Вот и все, можете заходить на страницу и проверять :-)

Как я говорил выше, есть куча способов реализовать хлебные крошки: через готовые gem'ы, одним запросов в MySQL, CSS и т.п. Но ещё раз повторюсь, этот способ был показан как самый простой вариант, который поймет любой новичок.


comments powered by HyperComments