Шрифт:
class Page
include DataMapper:: Resource
property: id, Serial
property: title, String
property: content, Text
property: lastupdated, DateTime
end
DataMapper.finalize
Данный фрагмент программы использует DataMapper для создания нового объекта под названием Page. Теперь Ruby может использовать Page подобно любому другому объекту, а я могу создавать и применять методы, которые формируют, изменяют и удаляют объекты Page. Изменения, внесенные в Page, сохраняются в базе данных при помощи DataMapper.
Команда DataMapper.finalize указывает приложению, чтобы оно создало эти поля, если они еще не существуют в действующей базе данных.
Теперь, когда база данных есть, пора выяснить, какие маршруты должна будет обслуживать среда разработки Sinatra. Вот какой у меня получился список:
# Show home page
g e t '/'
# Creates new note from "new page" form
p o s t '/'
# Displays requested note
get '/: url/'
# Edits requested note
get '/: url/edit'
# Saves user edits to note
p o s t '/: u r l /e d it'
# Deletes specified note
delete '/: url/'
# List all pages in database
get '/all/'
# Error handling
not_found
error
Это очень полезный список. Мое приложение будет строиться вокруг команд, которые я создам для каждого маршрута.
Слаги, везде слаги!
Помните, я сравнивал базу данных с магической стопкой учетных карточек, которую вы можете просматривать так, как вам удобно? Нам нужен способ поиска конкретных записей, и именно потому в этих маршрутах встречается 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, содержащий слаг, и отображает новую страницу.