Ruby on Rails - це неймовірна річ. Я вивчив Javascript і React до того, як подивився на будь-яку бекенд мову. Це змусило мене довго думати, що Ruby — це інструмент для зберігання інформації з фронтенду. Я бачив, як мої інструктори допомагали мені створювати файли JSON в Javascript як бекенд, а потім переносити цей JSON файл на Ruby бекенд без змін на фронтенді.
Хоча це був чудовий спосіб навчати бекенду на Ruby, я не розумів, наскільки Ruby може впливати на веб-додаток. Я був упевнений, що все, чим займається Ruby, це база даних і методи для читання та запису до цих баз даних. Тоді мене навчали Active Record, валідаціям, авторизаціям і серіалізаціям. З часом я почав розуміти, що ж насправді може Ruby on Rails, і це вразило мене.
Мій проект на Ruby на етапі 3 майже не мав бекенду. У мене була лише база даних, кілька міграцій і контролер додатка з усіма моїми CRUD-відповідями і запитами Active Record до бази даних. Ось фрагмент цього контролера додатка.
Як ви можете побачити, там лише кілька запитів на читання/запис і деякі запити Active Record. Протягом всього часу, поки я писав код для свого проекту на етапі 3, головна думка в моїй голові була: "Вау, це в принципі просто проект на React. Бекенд майже нічого не робить." Я пройшов перевірку проекту на етапі 3 з цією думкою, яка ніколи не йшла з моєї голови. Потім я дійшов до етапу 4.
Етап 4 у Flatiron School кардинально змінив моє уявлення про бекенд мови, яке я сформував за місяць до цього. Це був момент, коли я почав вивчати Ruby on Rails. У мене була ідея для проекту на етапі 4, для якого знадобилося значно більше роботи від бекенду. Поки я продовжував вивчати все, що може зробити Ruby, я почав думати: "Що ж вона не може зробити?".
Я створював моделі, окремі контролери, серіалізатори, макро-зв'язки, авторизації, користувацькі маршрути та методи. Здавалося, що обмеження Ruby раптом стали нескінченними. У мене були ідеї для мого проекту, які було б складно реалізувати через фронтенд. Я хотів, щоб кнопка на фронтенді впливала на 2 книги в моєму класі Book (книга), а також на поточного користувача. Вона також повинна була перевірити, чи має поточний користувач право здійснювати зміну, і повернути мінімум інформації на фронтенд, щоб змінити стан швидко та ефективно.
Ось до чого я прийшов.
Замість того, щоб переглядати всіх батьків/дітей книг та властивостей користувача, Active Record Ruby дозволив мені шукати через базу даних на бекенді, отримувати всі властивості конкретних екземплярів, які мені потрібні, і повертати їх на фронтенд як відповідь на один запит.
Контролер додатка на бекенді також містить всю необхідну обробку помилок для інших контролерів.
Якщо запит на голосування не може знайти конкретний екземпляр або викликається неавторизованим користувачем, він буде зупинений контролером додатка, і фронтенд отримає статус, відмінний від 'ok', з помилкою або списком помилок.
Ці обробники помилок не лише допомагають фронтенду, але й захищають моє додаток від хакерів та інших програмістів, які можуть здійснювати запити через інші інструменти, такі як Postman.
Припустимо, хакер знаходить код і знає, які запити та дані бази він повинен надіслати, щоб здійснити голосування поза сесією користувача. Потім він заходить в Postman і будує запит PATCH з дійсною інформацією. Він натискає кнопку відправлення, очікуючи отримати відповідь 'ok'. Він успішно обійшов фронтенд і змінив базу даних без входу в систему... так?
Насправді це неправильно. Як видно з двох попередніх зображень, контролер додатка має зручний користувацький метод "authorized", який не дозволяє нікому змінювати вміст додатку без попереднього входу в систему та створення сесії браузера. Однак є два методи контролера, для яких авторизація не потрібна. Це індекс книг (коли клієнт запитує список всіх книг) і метод створення користувача (це повинно бути зрозуміло). Це тому, що ці два методи важливі для завантаження додатку спочатку і дозволяють новому користувачу створити акаунт.
Це лише початок того, що бекенд мови, як Ruby, можуть зробити. Я зміг створити набагато більш складний додаток за допомогою Ruby on Rails, ніж я коли-небудь думав, що зможу зробити сам. Я більше ніколи не буду створювати додаток без допомоги потужного бекенд ресурсу.
Перекладено з: How Rails Goes Well Beyond the Frontend