Створення базової структури CRUD-застосунку на Sinatra в Ruby

Привіт! Мене звати Жерміла СЕНТ-ЖАН. Я дуже захоплююсь програмуванням і завжди шукаю нові виклики. Я навчаюсь у Flatiron School. Дозвольте мені поділитися з вами застосунком, створеним за допомогою Sinatra, під назвою "Улюблені книги".

Що таке застосунок Sinatra?

Sinatra — це бібліотека для веб-застосунків (web application library) з відкритим кодом та мова, спеціалізована на певній доменній області (domain specific language), написана на Ruby. Це альтернатива іншим Ruby-фреймворкам для веб-застосунків, таким як Ruby on Rails, Merb, Nitro та Camping. Він залежить від інтерфейсу веб-сервера Rack. Назву фреймворк отримав на честь музиканта Френка Сінатри.

Розроблений і спроєктований Sinatra є невеликим та гнучким. Він надає можливість створювати веб-застосунки на Ruby з мінімальними зусиллями. Потрібно лише створити добре структурований застосунок, дотримуючись рекомендованого патерну Model View Controller (MVC) та дій Create Read Update Delete (CRUD).

Улюблені книги

Мій застосунок називається Улюблені книги. Це повнофункціональний CRUD-застосунок, створений із використанням фреймворку Sinatra.

"Улюблені книги" дозволяє реєструватися та створювати список улюблених книг (назва книги, жанр тощо), а також створювати обліковий запис для збереження та редагування власних книг. Ви можете переглядати, редагувати та видаляти власні записи, але лише переглядати записи інших користувачів. Цей застосунок створений для легкого та простого створення списків.

pic

Я коротко поясню, як я налаштував свій застосунок, які інструменти використовував і які концепції лежать в його основі. Якщо ви хочете спробувати застосунок, дотримуйтесь інструкцій:

  1. Клонувати репозиторій Улюблені книги
  2. Виконайте команду cd, щоб увійти до папки
  3. Запустіть bundle install (для встановлення всіх гемів) і rake db:migrate (для налаштування бази даних)
  4. Виконайте команду shotgun (для створення сервера) та відкрийте надане посилання у своєму браузері

MVC (Model-View-Controller)

Можливо створити такий застосунок у одному файлі, з сотнями, а можливо, і тисячами рядків коду — але це швидко стане проблематичним.

Ви повинні розділити свій застосунок так, щоб написання, читання та налагодження стали простішими та приємнішими — не лише для вас, а й для можливих співробітників чи інших розробників.

Однією з популярних структур для розділення обов’язків є Model-View-Controller (MVC):

  • Моделі (Models): Моделі — це "мозок" вашого застосунку, тут відбувається маніпуляція даними.
  • Подання (Views): Подання забезпечують інтерфейс користувача вашого застосунку, усе, що користувач може бачити й з чим взаємодіяти, зберігається у поданнях.
  • Контролери (Controllers): Контролери — це прошарок між поданнями та моделями, вони з’єднують їх і забезпечують взаємодію між ними.

Детальніше про структуру Model-View-Controller: Understanding Model-View-Controller.

Існують певні правила іменування для структури папок у MVC, яких слід дотримуватися:

| Компонент | Множина/однина | Розташування | Файл | Константа | Таблиці Tables (множина) | База даних |
|---------------------|-----------------|------------------------|---------------------|-----------|----------------------------|--------------|
| Моделі Models | Однина | app/models | song.rb | Song | songs | Database |
| Контролери Controllers | Множина | app/controllers | songscontroller.rb | SongsController | — | — |
| Подання _Views
| Множина | app/views/songs | index.erb, show.erb | — | — | — |

Правила іменування стануть зрозумілішими після перегляду структури файлів/папок.

Структура папок

pic

Папка app

Ця директорія містить основну частину нашого застосунку, в ній знаходяться наші моделі, подання та контролери.

Папка models

Ця папка містить моделі, кожен файл моделі представляє компонент вашого застосунку — у цьому випадку User, Book і List. Контролер застосунку пов’язує інші контролери й зазвичай потрібен для таких застосунків. Він містить блок configure, який вказує контролеру, де знаходяться подання та публічна директорія, а також helpers — тут зберігаються глобальні допоміжні методи.

Папка views

Ця директорія містить різні подання, які бачить кінцевий користувач. Подання згруповані в папки для кожного компонента. Файли index та layout (надає макет для всіх файлів .erb) у головній директорії не належать до жодного конкретного компонента.

Файли подання мають формат erb (embedded Ruby), який дозволяє писати звичайний HTML із вкрапленнями елементів Ruby.

Папка config

Ця папка містить файл environment.rb, який з’єднує всі файли нашого застосунку з відповідними гемами (gems) та між собою.

Папка db

Ця директорія містить вашу базу даних і міграції бази даних. Щоб створити нову міграцію, просто виконайте rake db:create_migration NAME=create_users із відповідною назвою, і Rake створить для вас міграцію з відповідною позначкою часу.

Папка public

Ця папка містить ресурси для фронтенду, такі як CSS-таблиці стилів, JavaScript-файли та зображення.

Файл config.ru

Файл config.ru необхідний для створення застосунків на основі Rack. Він завантажує середовище вашого застосунку, код, бібліотеки та вказує, які контролери потрібно завантажити.

Файл Gemfile

Цей файл містить список усіх гемів (gems), які потрібні для застосунку. Виконання bundle install у командному рядку встановить усі вказані геми та їх залежності. Щоб створити новий Gemfile, просто введіть bundle init у терміналі (переконайтесь, що ви знаходитесь у кореневій папці проєкту).

Файл Rakefile

У файлі Rakefile ви можете визначати власні rake-завдання. Щоб побачити всі доступні завдання rake, просто виконайте rake -T. Детальніше про створення rake-завдань: Using Rake to Automate Tasks.

Інші файли

Ви можете додати файл README.md до своєї директорії, щоб допомогти іншим розробникам зрозуміти ваш застосунок, дізнатися, як ним користуватися, і як вони можуть долучитися до його розробки.

Файл LICENSE.md містить вашу ліцензію.

CRUD

CRUD — це акронім від Create (створити), Read (читати), Update (оновити) та Delete (видалити), які є чотирма базовими функціями постійного зберігання.

  • Create (створити) дозволяє користувачу створювати або додавати нові записи; це додає новий рядок до бази даних (виконуючи оператор INSERT). У вашому контролері це дія, яка рендерить форму подання /books/new, яка після відправлення створює новий екземпляр вашої моделі.

  • Read (читати) означає перегляд або отримання існуючих записів; це витягує конкретні записи з бази даних і відображає їх на сторінці. Це дозволяє користувачу переглядати або конкретний екземпляр класу (/books/:id), або всі екземпляри (/books або /users/:username).

  • Update (оновити) дає змогу оновлювати чи редагувати існуючі записи, що змінює рядок у вашій базі даних (виконуючи оператор UPDATE). Для цього потрібна дія контролера, яка рендерить форму оновлення для конкретного запису (/books/:id/edit), та інша дія для отримання даних із форми.

  • Delete (видалити) дозволяє користувачу видаляти або прибирати існуючі записи; це видаляє рядок у вашій базі даних. На відміну від інших дій, видалення зазвичай доступне лише через кнопку видалення (у нашому випадку /users/:username), а не через URL.

Інструменти

Sinatra

Sinatra — це мова, спеціалізована на певній доменній області (Domain Specific Language), для написання веб-застосунків. Вона залежить від Rack (який створює інтерфейс для Sinatra) і є альтернативою іншим фреймворкам, таким як Ruby on Rails, але набагато легшою. Простіше кажучи, Sinatra надає попередньо написані методи, які дозволяють, наприклад, перетворити наш CLI-застосунок у веб-застосунок.

ORM/ActiveRecord

Бази даних можуть стати досить великими й складними, тому нам потрібна допомога для роботи з ними. Створення власних методів для взаємодії з базою даних є трудомістким і більше не є необхідним — ось чому використовується ORM.

ORM (Object Relational Mapping) — це прошарок між вашою базою даних і вашим застосунком. Стандартом є відображення (або еквівалентність) Ruby класів до таблиць бази даних, а екземплярів цих класів до рядків у таблиці. ActiveRecord — це бібліотека Ruby, яка робить саме це — зв’язує класи з реляційними SQL-базами даних.

Таким чином, ActiveRecord є ORM, який допомагає працювати з базами даних. Як зазначено на rubyonrails.org: “ActiveRecord є M у MVC — модель — яка відповідає за представлення бізнес-даних і логіки”.

Проблеми

Одна з конкретних проблем, яка мене затримала під час створення цього застосунку, була пов’язана з повідомленнями сесій (session messages); точніше, як видалити певне повідомлення сесії після оновлення сторінки. Проблема полягала в тому, що після оновлення сторінки повідомлення сесії, яке вже було завантажено, знову і знову завантажувалося під час кожного оновлення.

Це відбувалося тому, що повідомлення, після першого рендерингу, зберігалося в cookie сесії та залишалося там, поки сесію не завершено. Рішення виявилося набагато простішим, ніж я думав. Замість використання @message = session[:message], потрібно було просто написати @message = session.delete(:message). Це видаляє повідомлення сесії після кожного оновлення сторінки.

Додаткові матеріали

  • Ознайомтеся з перехідним станом у статті Sessions in Sinatra.

Ось посилання на застосунок

GitHub: https://github.com/germilasaintjean/favoritebookssinatra

Відео огляду

YouTube: https://www.youtube.com/watch?v=UQ4TxABuZYE

Перекладено з: Building the Basic Structure of a Sinatra CRUD App in Ruby

Leave a Reply

Your email address will not be published. Required fields are marked *