Мене звати Мак Даулл, я вивчаю повний стек веб-розробки вже 6 місяців у Flatiron, і сьогодні я покажу вам, як створити веб-застосунок із нуля за допомогою Sinatra. Для цього вам необхідно мати базові знання Ruby.
Що таке Sinatra?
Sinatra — це мова, спеціалізована на певній доменній області (Domain Specific Language), реалізована на Ruby, яка використовується для створення веб-застосунків. Вона базується на Rack, що означає, що її можна інтегрувати в будь-який стек додатків на основі Rack, включаючи Rails.
На відміну від Ruby on Rails, який є фреймворком для повного стеку веб-розробки, що забезпечує все необхідне від фронтенду до бекенду, Sinatra спроєктований як легкий і гнучкий інструмент. Він надає лише мінімально необхідний функціонал і абстракції для створення простих і динамічних веб-застосунків на Ruby.
1. Майте чітке уявлення про те, що хочете створити
Вам не потрібно знати весь свій код перед початком роботи, але обов’язково потрібно мати уявлення про те, як виглядатиме ваш проєкт, наприклад, скільки у вас буде моделей або подань.
2. Створення структури
У своєму проєкті я використовую таку структуру:
.
├── apps
│ ├── Controllers
│ │ └── # Ваші контролери
│ ├── models
│ │ └── # Ваші моделі
│ └── views
│ │ └── # Ваші подання
│ ├── layout.erb # стандартний шаблон HTML
│
├── config.ru # Ваш конфігураційний файл Rack
├── db
│ ├── development.sqlite # База даних Sqlite3
│ ├── migrate
│ │ └── # Міграції
│ └── schema.rb
├── config
│ └── environment.db
├── Gemfile
└── Rakefile # Ваші завдання Rake
3. Gemfile і гемами
Для управління залежностями у вашому застосунку вам потрібен GEMFILE.
Запустіть bundle init
, щоб згенерувати файл.
Важливо додати всі геми, які вам спочатку потрібні для правильного функціонування процесу розробки, такі як Sinatra, ActiveRecord, sqlite3, rake, require_all, shotgun тощо. Ось приклад мого файлу:
source 'https://rubygems.org'
gem 'sinatra'
gem 'activerecord', require: 'active_record'
gem 'rake'
gem 'sqlite3', '1.3.13'
gem 'shotgun'
gem 'require_all'
gem 'sinatra-activerecord', :require => 'sinatra/activerecord'
gem 'bcrypt'
gem 'rack-flash3', require: 'rack-flash'
Після додавання гемів виконайте команду bundle install
.
4. Створіть папку config і файл environment
Це дуже важливий файл, у якому налаштовується підключення до бази даних. Він також з'єднує вашу папку app
з іншими файлами, які її потребують.
require 'bundler'
require 'bundler/setup'
Bundler.requireActiveRecord::Base.establish_connection(adapter: 'sqlite3',database: 'db/development.sqlite')
require_all 'app'
5. Створіть файл config.ru — найважливіший файл вашого застосунку
У цьому файлі потрібно завантажити середовище та вказати, де розміщені контролери вашого застосунку.
require_relative 'config/environment.rb'use Rack::MethodOverrideuse UsersController# use ControllerOfUrApp# use OtherControllerrun ApplicationController
6. Створіть контролер застосунку
У папці app/controllers
створіть файл application_controller.rb
. Він може виглядати приблизно так, якщо ви використовуєте сесії. Переконайтесь, що інші контролери успадковуються від цього контролера.
class ApplicationController < Sinatra::Base
configure do
set :views, 'app/views'
enable :sessions
set :session_secret, "password_security"
end
get '/' do
"Hello, World!"
end
end
Запустіть shotgun
у вашій командній стрічці, щоб протестувати застосунок.
Перевірте ваш браузер за локальною адресою, ви повинні побачити “Hello, World!”
7. Створіть Rakefile
Файл Rakefile призначений для специфікації завдань і дій. Він має завантажувати ваше середовище і вимагати sinatra/activerecord/rake
.
Я додав завдання для запуску консолі, яке виглядає так:
require_relative 'config/environment.rb'
require 'sinatra/activerecord/rake'task :console do
Pry.start
end
Щоб відкрити консоль, просто введіть rake console
. Тут ви можете тестувати ваші моделі та базу даних на пізніших етапах розробки. Це забезпечує прямий доступ до екосистеми вашого застосунку і є надзвичайно корисним.
8. Створіть папку бази даних (db) і виконайте міграції для створення таблиць
Це місце, де будуть зберігатися всі ваші міграції та база даних. Тепер час виконати ваші міграції. Введіть rake -T
, щоб побачити список доступних завдань rake.
Я покажу, як створити таблицю користувачів. Вам потрібно виконати команду rake db:create_migration NAME=create_users
у терміналі, і вона створить папку migrate
у папці db
із нашою міграцією xxx_create_users.rb
. Додайте наступний код у файл:
class CreateUsers < ActiveRecord::Migration[5.2] def change create_table :users do |t| t.string :username t.string :password_digest end endend
Я додав два поля в таблицю користувачів: username і passworddigest. Оскільки я використовую bcrypt, який дозволяє захистити паролі користувачів, я використовую passworddigest замість password (не забудьте додати bcrypt у ваш Gemfile).
Виконайте команду rake db:migrate
, це створить файл schema.rb і базу даних для розробки.
├── db
│ ├── development.sqlite
│ ├── migrate
│ │ └── 20190121195042_create_users.rb
│ └── schema.rb
9. Створіть файл моделі
Наприкінці дня файл моделі — це Ruby-клас. Якщо у нього є відповідна таблиця в базі даних, він наслідує клас ActiveRecord::Base
, що дозволяє отримати доступ до багатьох методів для роботи з базою даних. Установіть усі необхідні асоціації моделей (це дуже важливо).
У папці app/models
створіть файл user.rb
і додайте наступний код:
class User < ActiveRecord::Base validates :username, presence: true validates :username, uniqueness: true has_secure_passwordend
Більше деталей про валідації.
Оскільки я використовую bcrypt, я додав hassecurepassword у модель, що додає методи для створення та аутентифікації пароля за допомогою BCrypt.
На цьому етапі ви можете перейти до своєї консолі, додати користувача та спробувати його автентифікувати (див. деталі тут).
10. Додайте контролери, маршрути та подання
Тепер час додати інші контролери, маршрути та HTML-файли. Створіть UsersController або SessionController у папці controllers
і підключіть його у config.ru
. Ось мій файл UsersController:
class UsersController < ApplicationController
use Rack::Flashget '/signup' do
erb :'users/signup'
endpost '/signup' do
@user = User.new params[:user]
if @user.save
session[:user_id] = @user.id
flash[:info] = "You've been successfully registered"
redirect '/movies'
else
erb :'users/signup'
end
endget '/login' do
@active_signin = 'active'
redirect to '/movies' if logged_in?
erb :'users/login'
endpost '/login' do
@user = User.find_by username: params[:user][:username]
if @user && @user.authenticate(params[:user][:password])
session[:user_id] = @user.id
redirect '/movies'
else
flash[:msg] = "The username or password did not match our records.
"Будь ласка, спробуйте ще раз"
redirect '/login'
end
endpost '/logout' do
session.clear if logged_in?
redirect to '/'
endend
Я створюю декілька маршрутів, пишу код для створення, пошуку та автентифікації користувача, використовую ERB (мова шаблонів, заснована на Ruby) для рендерингу потрібного HTML, і використовую gem rack-flash3, щоб відображати повідомлення для користувача.
Спочатку в маршруті /signup я рендераю HTML-шаблон під назвою signup.erb, який знаходиться в папці db/views/users
.
Важливо знати дещо про файл layout.erb. Цей файл містить базову структуру HTML-тегів і ключове слово yield
всередині спеціального тега <%= yield %>
. Таким чином, щоразу, коли ви переходите за маршрутом, цей файл завантажується, а файл, який ви викликаєте в маршруті, вставляється в layout.erb
. Якщо ви подивитесь на мій файл signup.erb, ви помітите, що в ньому немає тегів html і body, а лише тег form.
Коли користувач відправляє форму, я беру значення введених даних у хеші params у маршруті post /signup, створюю новий екземпляр користувача та зберігаю його в базі даних. Така ж логіка використовується для інших маршрутів.
Опанувавши ці знання та маючи базову структуру, ви можете додати інші контролери, подання та маршрути у вашому застосунку, щоб створити щось неймовірне!
Сподіваюся, цей пост був корисним. Ось посилання на мій репозиторій на GitHub на випадок, якщо ви хочете переглянути мій код або спробувати мій застосунок.
Перекладено з: HOW TO BUILD A SINATRA APP