Sinatra був створений Блейком Майзерані (Blake Mizerany) у 2007 році як фреймворк (framework) для веб-застосунків на Ruby з відкритим вихідним кодом. Це історія про те, як я створив свій перший простий веб-застосунок, використовуючи цю невелику і гнучку мову, спеціалізовану на певній доменній області.
Спершу, замість того щоб створювати структуру файлів самостійно, я використав дуже потужний і простий gem для генерації середовища Sinatra під назвою corneal. Було важко повірити, як швидко він створив файл config.ru, усі файли MVC (Model Views and Controllers), а також усі необхідні інтерфейси rack для його middleware.
Після розпакування я запустив включений файл ‘.rspec’, щоб перевірити, чи середовище працює без ускладнень. Ввівши ‘shotgun’ у терміналі в межах шляху до мого автогенерованого застосунку, я переконався, що все працює належним чином і можна починати писати код. Відразу з’явилася успішна сторінка привітання на ‘localhost:9393’.
Настав час вирішити, які моделі мені потрібні. Оскільки я вирішив, що мій веб-застосунок буде простою бібліотекою відеоігор для будь-якого користувача, я додав 3 моделі (або класи) і зробив їх наслідуваними від ActiveRecord, щоб отримати доступ до макросів бази даних. Наприклад: ‘class Games < ActiveRecord::Base’.
Для того щоб відобразити мої класи в базі даних, потрібно було вирішити, як пов’язати всі мої моделі, і ось як це вийшло:
Після додавання відповідних макросів ActiveRecord (наприклад, ‘belongstomany users’) я перейшов до створення міграцій (migrations), щоб перевірити, чи мої класи правильно пов’язані. Я створив три файли міграцій і додав схему для кожної таблиці, потім виконав ‘rake db:migrate’ і почав тестувати їх за допомогою чудового gem під назвою ‘tux’. Коли все запрацювало чудово, я перейшов до створення маршрутів (routes) та подань (views) у Sinatra.
Я створив три додаткові контролери (controllers) Sinatra для свого застосунку, названі на честь моїх моделей (наприклад, ‘UsersController < ApplicationController’, де останній наслідує від Sinatra::Base) і додав два допоміжні методи (‘currentuser’ і ‘loggedin?’) для перевірки дозволів.
Створення маршрутів у контролерах було трохи нудним, особливо частина з перевіркою, щоб користувач бачив тільки те, що йому слід бачити. Допоміжні методи (helper methods) були вкрай важливими для цього.
Після виснажливої перевірки всіх маршрутів, щоб вони перенаправляли або відображали правильне подання, моя основа була завершена. Також потрібно було переконатися, що всі маршрути мали правильні ‘params’ для створення об'єктів або передачі їх назад до подань у моїх файлах ‘erb’.
Коли основа мого застосунку була готова і працювала, а під "основою" я маю на увазі, що все функціонувало, але виглядало як із 90-х років, або навіть гірше. Треба було щось робити із зовнішнім виглядом.
Саме тоді я зрозумів, що потрібно переробити всі подання, щоб зробити їх привабливішими. Робота над їхньою естетикою зайняла у мене більше часу, ніж саме функціонування застосунку.
Я вирішив опублікувати свою першу версію застосунку як мінімально життєздатний продукт (Minimum Viable Product) після базового оформлення CSS, щоб надати йому життя.
Найважливіший урок, який я засвоїв, — це думати про UX (досвід користувача) з самого початку. Повірте, ви не захочете робити це навпаки.
Ось посилання на мій репозиторій: Gamestocker
P.S. Якщо ви збираєтеся використовувати сесії (sessions) і перевірку користувачів, не забудьте включити gem bcrypt у свій Gemfile і додати наступний макрос у вашу модель User: ‘hassecurepassword’.
Перекладено з: Creating a Simple Sinatra App