При изучение Ruby on Rails в одной из глав знакомишься с организацией routes в Rails. Весь принцип построения ресурсов выглядит продуманно и красиво. В концепции построение url фигурируют понятные и удобные для программиста ID (как правило integer типа).
Например, одна строка
Метод HTTP | Путь | Экшн | Использование |
---|---|---|---|
GET | /photos | index | отображает список всех фото |
GET | /photos/new | new | возвращает форму HTML для создания нового фото |
POST | /photos | create | создает новое фото |
GET | /photos/:id | show | отображает определенное фото |
GET | /photos/:id/edit | edit | возвращает форму HTML для редактирования фото |
PATCH/PUT | /photos/:id | update | обновляет определенное фото |
DELETE | /photos/:id | destroy | удаляет определенное фото |
Данный способ прост и логичен для быстрой разработке прототипа. Такой подход понятен и логичен для разработчика. По одному url понятно какой controller и action отвечает за функционал. После перехода проекта в стадию продвижения, за дело берутся SEO специалисты проверяя сайт по своему чек листу.
Одна из первых переделок проекта - это переделка уролов на так называемые ЧПУ (человека понятные урл).
Например http://site.ru/foto/priroda/zavat
Изначально концепция предполагала, что пользователю легче это запомнить и набрать, чем адрес вида
http://site.ru/?cid=1&id=2
Я мало верю в то, что сейчас пользователи набирают полные адреса страниц на память. Скорей они используют поисковые системы. А вот поисковые системы, по словам СЕО спецов, дают плюс 100 в карму сайта если у них в адресе страницы присутствуют ключевые слова.
Вот тут и понадобиться более подробно познакомиться с функционалом routes в Rails
Примеры красивых URL первого уровня
Перед нами задача организовать красивые урл для страниц разных по типу, но имеющий одинаковый принцип именованияПримеры:
http://сигачев.рф/как_изучить_руби - статья из блога
http://сигачев.рф/отдых_на_выходных - Категория из каталога фото
http://сигачев.рф/фантастика - категория из каталога книг
Для приведенных СЕО ссылок трудно сказать к какому контролеру они относятся, и поэтому мы вынуждены их все по очереди проверить на присутствие в базе для разных ресурсов. Если два и более ресурсов будут иметь одинаковые имена, то отобразится тот чей роутер в правилах находится первым.
match '/:name' => 'pages#show', :constraints => PageNameConstraint.new, :as => :seo_page match '/:name' => 'photo#category', :constraints => PhotoCategoryConstraint.new, :as => :seo_photo_category match '/:name' => 'book#category', :constraints => BookCategoryConstraint.new, :as => :seo_book_category
Для работы нам потребуется определить три класса, которые фигурируют в условиях
class PageNameConstraint def matches?(request) @page = Page.find_by_name request.path_parameters[:name] !@page.nil? end end class PhotoCategoryConstraint def matches?(request) @category = PhotoCategory.find_by_name request.path_parameters[:name] !@category.nil? end end class BookCategoryConstraint def matches?(request) @category = BookCategory.find_by_name request.path_parameters[:name] !@category.nil? end end
Минусом такого подхода является необходимость делать лишние запросы для поиска к чему относится запрашиваемый адрес. При обращение к несуществующей странице, мы вынуждены будет сделать поиск по всем цепочкам моделей прежде чем показать 404
Субдомены и приложение Rails
Не редко возникает необходимость вынести часть функционала сайта на домен третьего уровня. Здесь встает вопрос как управлять routes и как их различать, например, индекс для основного сайта и для сайта на домене третьего уровня.class BookSubdomain def self.matches?(request) !!request.subdomain && request.subdomain =~ /^book\b/ end end .... constraints(BookSubdomain) do match '/' => 'index#book', :as => :book end
match '/:category/page-(:page)' => 'book#show', :constraints => {:subdomain => /book.*/, :category => /fantasi|detectiv/, :page => /\d+/}
- субдомен будет начинаться на book
- категория будет содержать подстроку fantasi или detectiv
- номер страницы будет числом
Как мы видим в Rails достаточно богатый функционал для организации и обработки URL сайта позволяющий решить любые задачи. При разработке нужно лишь более детально изучить документацию