При создании Интернет-магазина на базе Rails одной из проблем является создание ЧПУ (человеко подобных ссылок) для удобной навигации и SEO-прожвижения. Существующие методы, описанные например, здесь и здесь, позволяют частично решить проблему путем, фактически, замены цифрового идентфиикатора на friendly-slug. При этом сложно добиться ряда SEO-эффектов:
- В рамках традиционной модели роутинга Rails отсутствует управление вложенностью категорий. То есть непросто
сделать такой url, как
/tovary/phones/android/nexus-phones
. Такую иерархию можно сделать черезnamespaces
, но корректировать такую иерархию может только программист изменнием исходного кода. Такое ограничение хорошо видно наSpree
, где даже указав в админке категорию, и родительскую категорию, на уровне URL все категории будут все равно отображаться на одном уровне глубины. - Обычно часть URL, отвечающая за обработку контроллера, совпадает по имени с контроллером. Альтернативный вариант
указать
as:
при создании route. При этом изменить его пользователем самостоятельно, например, через админку, без программиста, затруднительно.
Модуль StRoutes
обеспечивает:
- Вложенность категорий
- Автогенерация уникальных имен категорий и страниц
- Возможность отнесения одной страницы к разным категориям
- Возможность отнесения одной категории к нескольким родительским категориям
- Возможность депубликовать временно страницу
- Генерация файла sitemap.txt
- Автоматический вызов контроллера и действия, соответствующего по неймингу типу страницы
- Расчет числа страниц в каждой категории
- Поддержка канонических ссылок
- Сокрытие корневной категории из URL
- Генерация HTML-фрагмента "хлебных крошек"
Работа плагина сосотоит из следующей последовательности действий:
- Подключение модуля
- Расширение миграций для страниц и категорий
- Создание корневых категорий
- Настройка роутинга
- Настройка фоновых задач
ToDo:
- Админка для модуля ActiveAdmin
- Генератор 301-х ридеректов
- Генератор коротких ссылок
- Интеграция с метрикой
Добавьте в Gemfile:
gem 'st_routes'
Выполните:
$ bundle
Или запустите отдельную инсталляцию гема:
$ gem install st_routes
Создайте дополнительные миграции для таблиц pages
и categories
. Добавьте в них необходимые поля для
отображения и управления страницами и категориями. Например, поля описания, метаданных, изображение-обложку и пр.
Пример:
class ExpandStRoutesPages < ActiveRecord::Migration[5.0]
def change
add_column :st_routes_pages, :body, :text, default: ''
end
end
Скопируйте в папку db/seeds
шаблоны корневых категорий:
$ rails st_routes:install:roots
В файле root_categories.rb
необходимо отключить или изменить не нужные категории, и загрузить их в базу данных:
$ rails st_routes:install:seed
Чтобы использовать библиотечные функции st_routes, необходимо добавить в файл application.rb
следующую строку
config.autoload_paths += Dir["#{StRoutes::Engine.root}/lib/**/"]
Добавьте в файл routes.rb
последней строкой следующую:
get "*path", to: StRoutes::RecognizeRoute.new
Добавление этой строки обеспечит передачу URL страницы или категории в модуль StRoutes, где произойдет распознование (парсинг) URL, выделение страницы и категории, и вызов соответствующего контроллера с действием. При этом будет доступна следующая структура
params = {
:type => :category, # Тип маршрута: :category, :page, :mainpage, :not_found
:category_id => 34, # Идентификатор категории
:page_id => 0, # Идентификатор страницы
:breadcrumb => [1, 11, 12] # Массив ID категорий для построения "хлебных крошек"
}
Если необходимо добавить иные типы страниц, например - корзину или поисковую выдачу, необходимо добавить соответствующие маршруты до указанной в начале этого пункта строки.
ToDo: пример файла
ToDo: определение количества страниц в категории
корневая категория
категория
страница
categories
- список категорийcategory_links
- связь категорий между собой по принципу каждый с каждымpages
- список страницpage_links
- связь страниц с категориямиcategory_urls
- кеш, в котором хранятся заранее построенные полные пути категорий и информация для "хлебных крошек"
parser
- классStRoutes::URL::Parser
, который обеспечивает распознование введенного URL и преобразование его в идентификаторы страницы и категории
Этот гем доступен по условиям лицензии MIT License.