Чтение онлайн

на главную - закладки

Жанры

Первые 20 часов. Как быстро научиться… чему угодно
Шрифт:

Это очень полезный список. Мое приложение будет строиться вокруг команд, которые я создам для каждого маршрута.

Слаги, везде слаги!

Помните, я сравнивал базу данных с магической стопкой учетных карточек, которую вы можете просматривать так, как вам удобно? Нам нужен способ поиска конкретных записей, и именно потому в этих маршрутах встречается url. Содержание параметра url указывает базе данных, какую запись следует извлекать.

В качестве параметра

можно использовать заголовок страницы, но тут есть одна проблема: браузеры не любят в интернет-адресах такие вещи, как пробелы, заглавные буквы и специальные символы (например, $ и %). В заголовках такие символы встречаются достаточно часто, поэтому от них нужно избавиться.

Строка, однозначно определяющая страницу сайта, называется слагом [43]. Слаг моей страницы будет основан на заголовке и подчиняться правилам, приемлемым для интернет-адресов.

1. Все символы строчные.

2. Никаких специальных символов — только буквы и цифры.

3. Никаких пробелов — все пробелы должны быть заменены на подчеркивание.

Для этого нужно создать метод, который берет заголовок страницы и форматирует его в слаг. Сложные замены выполняются при помощи метода программирования, получившего название регулярных выражений, который преобразует или находит текст в строках в соответствии с установленными правилами [44].

Регулярные выражения могут быть очень сложными, но применяются они широко, и я смог найти подходящий шаблон. Вот как выглядит мой метод:

# Converts page name into post slug

def slugify (content)

content.downcase.gsub (/ /, '-'). gsub (/ [^a-z0–9-] /, "). squeeze ('-')

end

Теперь я могу использовать метод slugify для преобразования строк типа «Заголовок Страницы» в «заголовок_страницы», которые можно использовать в составе интернет-адреса.

Кроме того, если мы храним слаг вместе с заголовком страницы, то можем использовать его для извлечения записи страницы при помощи параметра url.

Я добавил это поле к классу DataMapper:

property: slug, String

Теперь при создании страницы мы можем превратить ее заголовок в слаг, сохранить его в базе данных и использовать для демонстрации страницы, когда потребуется ее извлечь. Именно так приложение узнаёт, какую страницу показывать.

Создание страниц

Я начал разрабатывать список необходимых маршрутов. «Главный» маршрут прост: я перенаправляю его к слагу /home/, поскольку хочу, чтобы главная страница отображала содержимое соответствующей записи.

Маршрут «создать страницу» связан с небольшим полем ввода в верхней части бокового поля. Пользователь вводит заголовок страницы

в поле ввода и щелкает по кнопке. Система считывает заголовок страницы, преобразует его в слаг, затем сохраняет в базе данных заголовок, слаг и время создания. После этого система посылает запрос GET, содержащий слаг, и отображает новую страницу.

В маршруте «создать страницу» есть маленькая, но очень важная деталь: что если страница уже существует? Я не хочу переписывать ее заново, если она содержит данные. Случайная потеря данных недопустима.

К счастью, DataMapper разрешает эту проблему при помощи встроенного метода. first_or_create. Если страница уже существует, DataMapper не переписывает ее, а Sinatra перенаправляет браузер к существующей странице. Проблема решена.

Маршрут «отобразить страницу» считывает слаг в URL, извлекает запись из базы данных, а затем отображает информацию в области основного содержания. Позже я добавлю красивое форматирование, но теперь мне просто нужно, чтобы программа работала.

Редактирование страниц

Редактирование страниц включает два отдельных маршрута. Первый маршрут запросом GET вызывает страницу, которую хочет отредактировать пользователь, а затем отображает содержимое соответствующей записи базы данных в форме, удобной для редактирования.

Для отображения страниц приложение использует шаблон ERB, который обычно состоит из команд HTML + Ruby. ERB позволяет программисту писать HTML, включающий изменяемые элементы. Поскольку ERB обрабатывает страницу до того, как она появляется перед пользователем, текст на странице можно менять при каждой загрузке, основываясь на командах Ruby шаблона.

Кнопка «Сохранить» на экране редактирования посылает запрос POST приложению, которое обновляет запись Page.

Удаление страниц

Удаление страниц требует осторожности: нельзя забывать, что случайная потеря данных неприемлема. Собираясь удалить страницу, вы должны быть абсолютно уверены, что пользователь хочет именно этого.

Неправильно было бы напрямую связать кнопку «Удалить» с маршрутом DELETE приложения. При таком подходе страница удалится даже при случайном щелчке по кнопке.

Предпочтительнее разбить процесс на два этапа. Щелчок по кнопке «Удалить» на экране отсылает пользователя к окну подтверждения, где отображается заголовок страницы, которую пользователь намерен удалить. Если все правильно, пользователь щелкает по кнопке подтверждения, посылая запрос DELETE. Если кнопка «Удалить» нажата случайно, можно щелкнуть по кнопке «Отмена» или кнопке браузера «Назад».

Список всех страниц

Кнопка «Показать список страниц» направляет пользователя к слагу /all/, который отличается от слагов обычных страниц.

Поделиться:
Популярные книги

Господин моих ночей (Дилогия)

Ардова Алиса
Маги Лагора
Любовные романы:
любовно-фантастические романы
6.14
рейтинг книги
Господин моих ночей (Дилогия)

Его нежеланная истинная

Кушкина Милена
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Его нежеланная истинная

История "не"мощной графини

Зимина Юлия
1. Истории неунывающих попаданок
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
История немощной графини

Санек

Седой Василий
1. Санек
Фантастика:
попаданцы
альтернативная история
4.00
рейтинг книги
Санек

Убивать чтобы жить 6

Бор Жорж
6. УЧЖ
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 6

Стеллар. Трибут

Прокофьев Роман Юрьевич
2. Стеллар
Фантастика:
боевая фантастика
рпг
8.75
рейтинг книги
Стеллар. Трибут

Идеальный мир для Лекаря 26

Сапфир Олег
26. Лекарь
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 26

Отверженный VIII: Шапка Мономаха

Опсокополос Алексис
8. Отверженный
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Отверженный VIII: Шапка Мономаха

Хозяйка забытой усадьбы

Воронцова Александра
5. Королевская охота
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка забытой усадьбы

Убивать, чтобы жить

Бор Жорж
1. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать, чтобы жить

Душелов. Том 3

Faded Emory
3. Внутренние демоны
Фантастика:
альтернативная история
аниме
фэнтези
ранобэ
хентай
5.00
рейтинг книги
Душелов. Том 3

Ползком за монстрами!

Молотов Виктор
1. Младший Приручитель
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Ползком за монстрами!

Аргумент барона Бронина

Ковальчук Олег Валентинович
1. Аргумент барона Бронина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Аргумент барона Бронина

Газлайтер. Том 12

Володин Григорий Григорьевич
12. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 12