Задача

Создать веб-приложение, позволяющее пользователю составить список из треугольников. Список треугольников можно фильтровать по значению площади в диапазоне от минимального до максимального.

Приложение должно позволять пользователю добавлять новые треугольники. Они должны добавляться в список только из данных сторон можно составить треугольник.

Приложение также должно содержать в себе информацию о разработчике.

Технические аспекты реализации

Сайт должен содержать в себе следующие страницы:

  • Главная страница, содержащая ссылки на все другие страницы, а также описание решаемой задачи. Маршрут /.
  • Страница для вывода всех списка треугольников. Маршрут /triangles.
  • Страница для ввода данных для решения задачи. Маршрут /triangles/new.
  • Страница для показа информации о создателе приложения. Маршрут /about.

Общий макет страниц должен содержать навигационную панель, с которой можно перейти на главную страницу, страницу ввода информации, а также страницу для показа информации о создателе сайта.

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

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

Страница для показа списка треугольников должна отображать текущий список, а также поля для ввода фильтра по площади.

Страница о создателе приложения должна содержать имя и фотографию создателя.

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

Предлагаемый подход к решению задачи

  • Создайте каталог для сайта. Разместите в корне данного каталога следующие директории: models, public, views.
  • В каталог public поместите файлы CSS-фреймворка Bootstrap.
  • Создайте Gemfile и добавьте в качестве зависимостей roda, rubocop, rerun, puma. Для Windows также желательно установить джем wdm.
  • Создайте файл app.rb в корне проекта, в котором подключите джем roda.
  • Добавьте обработчик маршрута по умолчанию '/', выведите пользователю сообщение ‘Маршрут работает’.
  • Создайте файл config.ru, подключите туда приложение, определённое в app.rb.
  • Запустите приложение с использованием rackup и откройте браузер по ссылке http://localhost:9292 и убедитесь, что всё работает.
  • Завершите работу приложения, нажав комбинацию клавиш Ctrl+C. Запустите приложение с помощью rerun: bundle exec rerun rackup. Теперь после сохранения файлов сервер будет автоматически перезапущен. Для остановки Rerun введите q и нажмите ввод.
  • Добавьте файл views/layout.erb, в котором разместите навигационную панель, а для центральной части разместите вызов yield. То есть сделайте общую раскладку для сайта. В навигационной панели должны быть ссылки на все страницы сайта.
  • Добавьте файл views/index.erb, в котором разместите необходимое содержимое для первой страницы. Исправьте обработчик пути по умолчанию, чтобы он выводил содержимое файла index.erb.
  • В каталоге lib создайте классы, описывающие треугольник и список треугольников.
    • Класс Triangle должен содержать методы:
      • Конструктор, принимающий длины сторон в качестве аргументов.
      • triangle? — возвращает true или false в зависимости можно ли создать треугольник из данных сторон или нет.
      • area — возвращает площадь для треугольника и 0, если фигура не является треугольником.
    • Класс TriangleList должен содержать методы:
      • add_triangle, принимающий объекты типа Triangle и добавляющий их в конец списка.
      • all_triangles — метод для получения списка всех треугольников.
      • triangles_by_area — метод для получения фильтрованного списка.
    • Модуль InputValidators, содержащий методы:
      • check_min_and_max — метод для проверки ввода минимальных и максимальных значений.
      • check_side_lengths — метод для проверки ввода на странице добавления нового треугольника.
  • Подключите класс TriangleList в файл app.rb и поместите экземпляр данного класса в переменную @triangles.
  • Создайте страницу views/triangle_new.erb, содержащую форму для ввода данных. Отобразите эту страницу при переходе по маршруту /triangles/new. Форма должна посылать результаты обработки с помощью POST-запроса.
  • Корректно обработайте данные, передаваемые со страницы ввода данных. Ошибочными ситуациями считается отсутствие данных в поле ввода, а также отсутствие вещественных чисел в поле ввода.
  • Создайте страницу views/triangles.erb, которая может отобразить результаты ввода данных. Странице в качестве параметра должна передаваться ссылка на объект TriangleList.
  • Добавьте на страницу views/triangles.erb форму для фильтрации. Добавьте обработку фильтрации для данных этой формы.

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