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

на главную

Жанры

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

Вместо того чтобы извлечь одну запись, DataMapper извлекает все записи Page базы данных. Шаблон ERB для Page содержит условный цикл, который создает список всех извлеченных страниц. Каждый элемент списка содержит заголовок страницы, отображаемый в виде ссылки на соответствующий странице слаг. Щелчок по ссылке направляет пользователя на конкретную страницу.

Первый запуск приложения

Итак, у меня есть основные функции, однако есть и проблема: во время тестирования приложения попытка перейти

к главной странице вызывает сообщение об ошибке. Программа пытается найти запись Home в базе данных, но ее не существует, поскольку я запустил приложение в первый раз!

Выход — создать «однократный процесс управления» при помощи программы под названием Rake. Программы Rake хранятся в папке Rakefile, которая находится в корневом каталоге приложения.

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

Это делает Rake очень удобным средством для таких действий, как добавление начальной информации в базу данных перед запуском реальной программы. Я копирую необходимые фрагменты application.rb в Rakefile, затем пишу команду, которая создает новую запись для главной страницы в базе данных. Остается лишь один раз запустить следующую команду:

$ rake setup

Rake создает запись «Главная страница», и мое приложение перестает выдавать ошибку при запуске. Когда я размещу это приложение на Heroku, то запущу команду Rake удаленно, чтобы настроить базу данных перед первой попыткой использовать приложение.

Теперь все основные функции на месте. Пора добавить что-нибудь интересное.

Добавление поддержки бокового поля

Я только что сообразил, что не включил в боковое поле функцию добавления страниц, как планировал изначально. Это логическая функция, поскольку может иметь только два значения: страницу предполагается отобразить в боковом поле или нет.

Я добавил новый класс в DataMapper:

property: sidebar, Boolean, default => false

Я также добавил кнопку-флажок к экрану «Редактировать» рядом с вопросом «Включить в боковое поле?» и связал эту кнопку с соответствующим полем в базе данных. Затем написал простой цикл, чтобы найти записи в базе данных, когда sidebar = true, и вывести их в виде списка, аналогичного странице «Список всех страниц».

Я снова запускаю приложение, редактирую запись, и приложение вылетает. Проклятье!

Я снова и снова пытаюсь найти ошибку, но безуспешно. Перерыв документацию DataMapper и обратившись к Stack Overflow, я выясняю, что логические переменные плохо сочетаются с формами HTML. Нужен другой подход:

property: sidebar, Enum [: yes, no], default =>: no

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

Добавление

поддержки Markdown

Теперь я хочу, чтобы мои страницы могли иметь сложное форматирование, например жирный шрифт, курсив, заголовки.

В качестве форматирующего синтаксиса я выбрал Markdown, популярный и очень полезный язык разметки, разработанный Джоном Грубером [45]. Я уже знаком с работой Markdown, поскольку его использовали некоторые приложения, которые установлены на моем компьютере. Теперь мне нужно выяснить, как заставить мою программу понимать этот язык.

Довольно быстро мне удается найти несколько общедоступных библиотек Markdown. Я выбираю библиотеку rdiscount и включаю в application.rb:

require 'rdiscount'

Rdiscount преобразует текст из формата Markdown в HTML, а браузер пользователя затем отображает должным образом отформатированный текст. Файлы Markdown представляют обычные текстовые файлы, написанные по определенным правилам.

Это значит, что мне не нужно преобразовывать информацию моей страницы в Markdown, прежде чем добавлять в базу данных. Это ведь обычный текст. Если я хочу отобразить отформатированный текст, мне нужно лишь вызвать rdiscount.

Команда, которую я добавил в шаблоны ERB, отвечающие за отображение страниц, выглядит следующим образом:

<% markdown (@page.content)%>

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

Меры безопасности

А как насчет регистрации пользователей? Если я размещу приложение на Heroku, не запрашивая имени пользователя и пароля, то все смогут увидеть, что я помещаю в базу данных.

Как выяснилось, современные браузеры поддерживают безопасный протокол под названием «Базовая аутентификация HTTP» [46], который представляет собой простой способ потребовать у пользователя имя и пароль, прежде чем продолжить работу. Если пользователь не может предоставить полномочия доступа, его переправляют на страницу с сообщением об ошибке.

Вот фрагмент программы, обеспечивающий базовую идентификацию в Sinatra:

use Rack:: Auth:: Basic, "Restricted Area" do |username, password|

[username, password] == [ENV ['ADMIN_USER'], ENV ['ADMIN_PASS']]

end

В данном случае я храню имя пользователя и пароль в Heroku как переменные среды, которые я могу задать командой Terminal. Это позволяет мне использовать один и тот же код для разных приложений, а также показать вам этот код, не сообщая своего пароля!

Это также превосходная иллюстрация того, почему важно знать, что Sinatra построена над интерфейсом Rack. Дело в том, что существует много общедоступных библиотек типа Rack::Auth::Basic, и любую из них я могу использовать с Sinatra. Чем реже мне приходится изобретать колесо, тем лучше.

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

(Противо)показаны друг другу

Юнина Наталья
Любовные романы:
современные любовные романы
эро литература
5.25
рейтинг книги
(Противо)показаны друг другу

Школа Семи Камней

Жгулёв Пётр Николаевич
10. Real-Rpg
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Школа Семи Камней

Кодекс Охотника. Книга XXVI

Винокуров Юрий
26. Кодекс Охотника
Фантастика:
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXVI

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

Сапфир Олег
8. Лекарь
Фантастика:
юмористическое фэнтези
аниме
7.00
рейтинг книги
Идеальный мир для Лекаря 8

Не грози Дубровскому! Том V

Панарин Антон
5. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому! Том V

Я не князь. Книга XIII

Дрейк Сириус
13. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я не князь. Книга XIII

Машенька и опер Медведев

Рам Янка
1. Накосячившие опера
Любовные романы:
современные любовные романы
6.40
рейтинг книги
Машенька и опер Медведев

Деспот

Шагаева Наталья
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Деспот

6 Секретов мисс Недотроги

Суббота Светлана
2. Мисс Недотрога
Любовные романы:
любовно-фантастические романы
эро литература
7.34
рейтинг книги
6 Секретов мисс Недотроги

Возвращение

Жгулёв Пётр Николаевич
5. Real-Rpg
Фантастика:
боевая фантастика
рпг
альтернативная история
6.80
рейтинг книги
Возвращение

Идущий в тени 8

Амврелий Марк
8. Идущий в тени
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Идущий в тени 8

Неудержимый. Книга XVIII

Боярский Андрей
18. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XVIII

Идеальный мир для Социопата 2

Сапфир Олег
2. Социопат
Фантастика:
боевая фантастика
рпг
6.11
рейтинг книги
Идеальный мир для Социопата 2

Заставь меня остановиться 2

Юнина Наталья
2. Заставь меня остановиться
Любовные романы:
современные любовные романы
6.29
рейтинг книги
Заставь меня остановиться 2