Формирование HTML-документов и обработка форм в Roda

Андрей Васильев

2020

Система тестирования студентов

Реализуем простое веб-приложение, которое будет оперировать списком проверочных работ для студентов

Система должна поддерживать следующие действия:

Roda — модульная система

Roda построена по принципу модульной системы, с помощью модулей можно решать конкретные задачи разработки приложения

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

Для подключения модулей внутри RODA-приложения используется метод plugin

class App < Roda
  plugin :csrf
end

Доступные модули

Список модулей, поставляемых вместе с джемом roda, описан в официальной документации

Модули разделены на следующие группы:

Стандартная структура небольшого RODA-проекта

В рамках следующей пары занятий будем использовать простую схему организации файлов наших Roda-приложений

Структура такого приложения описана в конвенциях

Формирование вида, HTML-страниц

При показе HTML-страниц с точки зрения веб-сервера мы должны разделять

При развёртывании приложения для большого количества пользователей (больше 1) статические файлы должен раздавать специализированный веб-сервер (Nginx, Apache и т.п.)

При локальной разработке удобно раздавать файлы единым сервером

Раздача статических файлов

Для раздачи статических файлов будем использовать модуль Public

opts[:root] = __dir__
plugin :public

route do |r|
  r.public
end

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

Работа в режиме разработчика

Для ограничения раздачи файлов только в окружении для разработки будем использовать модуль Environments

configure :development do
  plugin :public
  opts[:serve_static] = true
end

route do |r|
  r.public if opts.key?(:serve_static)
end

Формирование динамических страниц

Для формирования HTML-документов используется библиотека tilt, которая поддерживает множество шаблонизаторов. В рамках курса мы будем использовать уже знакомые вам ERB-шаблоны. Данную библиотеку нужно добавить в зависимости приложения

На стороне Roda мы будем использовать следующие модули:

Render предлагает 2 метода для отображения информации:

Partials добавляет метод partial, работающий как render

Система раскладок, layout

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

Файл раскладки называется layout.erb и располагается рядом с шаблонами страницы в каталоге views

r.on 'tests' do
  r.get do
    view('tests')
  end
end

Передача данных для отображения

Существует два варианта передачи информации:

Что лучше использовать?

Полезные элементы языка Ruby

Эти классы и библиотеки входят в стандартную поставку языка Ruby

Создание классов для хранения данных

Класс Struct предоставляет возможности для быстрого создания классов для хранения данных

Он входит в состав языка, не надо подключать никаких библиотек

Customer = Struct.new(:name, :address)
dave = Customer.new("Dave", "123 Main")
dave.name     #=> "Dave"

Делегирование методов

Модуль Forwardable предоставляет инструменты для делегирования методов переменной экземпляра

require 'forwardable'

class RecordCollection
  extend Forwardable
  def_delegator :@records, :[], :record_number
  def initialize
    @records = [1, 5, 10]
  end
end

collection = RecordCollection.new
collection.record_number(0)  # => 4

Фильтрация данных

Фильтрация данных
Фильтрация данных

Комментарии к схеме взаимодействия

Изменение данных на сервере

Изменение данных
Изменение данных

Комментарии к схеме взаимодействия