При показе HTML-страниц с точки зрения веб-сервера мы должны разделять
Статические документы, не зависящие от состояния сервера (данных им управляемых). В нашем случае это CSS-документы, JavaScript-документы, они не изменяются, когда пользователь взаимодействует с сервером.
Динамические документы, зависящие от состояния сервера. В нашем случае это HTML-страницы, формируемые в ответ на запрос от пользователя.
При развёртывании приложения для большого количества пользователей (больше 1) статические файлы должен раздавать специализированный веб-сервер (Nginx, Apache и т.п.)
При локальной разработке удобно раздавать файлы единым сервером
Раздача статических файлов
Для раздачи статических файлов будем использовать модуль Public
opts[:root] = __dir__plugin :publicroute do |r| r.publicend
Хеш opts содержит настройки приложения, которые могут быть использованы как модулями, так и разработчиком приложения
Работа в режиме разработчика
Для ограничения раздачи файлов только в окружении для разработки будем использовать модуль Environments
configure :developmentdo plugin :public opts[:serve_static] = trueendroute do |r| r.public if opts.key?(:serve_static)end
Формирование динамических страниц
Для формирования HTML-документов используется библиотека tilt, которая поддерживает множество шаблонизаторов. В рамках курса мы будем использовать уже знакомые вам ERB-шаблоны. Данную библиотеку нужно добавить в зависимости приложения
На стороне Roda мы будем использовать следующие модули:
Render — базовый модуль для формирования HTML-страниц
Partials — модуль для отображения шаблонов, начинающихся с подчёркивания
Render предлагает 2 метода для отображения информации:
view - отображение шаблона страницы внутри раскладки
render - отображение шаблона без раскладки
Partials добавляет метод partial, работающий как render
Система раскладок, layout
При формировании страниц сайта у нас всегда есть общие элементы: заголовок, навигационная панель, подножие и технические элементы. Удобно поместить их в раскладку и подменять только центральную часть
Файл раскладки называется layout.erb и располагается рядом с шаблонами страницы в каталоге views
Фильтрация не изменяет состояние данных на сервере, поэтому используется GET-запрос
Условия обработки фильтров определяются на сервере
Все фильтрационные формы приложения должны работать одинаково
При выполнении фильтра не надо терять данные, введённые пользователям
Если в результате запроса данные не найдены, тогда надо явно об этом сообщить пользователю
Изменение данных на сервере
Изменение данных
Комментарии к схеме взаимодействия
POST-запрос используется для изменения состояния сервера
В ответ на POST-запрос показываем форму только в случае ошибки, в случае успеха POST перенаправляет пользователя к странице, где можно посмотреть новое состояние
В случае ошибки сервер должен вернуть форму с данными, которые пользователь ввёл на предыдущем шаге, нельзя терять данные
Если пользователь будет множество раз выполнять перезагрузку страницы, то в такой схеме вероятность двойного добавления минимальна