Як почати писати на Ruby on Rails: налаштування оточення, поради по коду та корисні геми

Комп'ютерне програмування — це те, що можна вивчити тільки шляхом практики. Щоб добре і швидко вивчити мову програмування, необхідно використовувати його як можна частіше. Раз ви читаєте цю статтю, то ви вже для себе вирішили, що вивчення програмування — це корисна для вас інвестиція в майбутнє. Я спробую допомогти вам почати працювати з Ruby, використовуючи фреймворк Rails.

Ruby і Rails

Rails настільки тісно пов'язаний з самим Ruby, що часом важко відрізнити одне від іншого. Але різниця велика: Ruby — це мова програмування, в той час як Rails — всього лише фреймворк, написаний для Ruby. Часто з-за зрівняння цих речей відбуваються конфлікти, особливо часті випадки, коли розробників, що спеціалізуються на розробці на Ruby, хантят, як розробників, що спеціалізуються на Ruby on Rails. Важливо розуміти, що Ruby — це не Rails. Документація Ruby доповнюється документацій Rails.

Фреймворк Rails вніс величезний внесок у розвиток мови Ruby, і саме останнім часом, разом з появою Rails, інтерес до Ruby став стрімко зростати. Так що, якщо у вас є бажання навчитися створювати різні web-додатки і не тільки на Rails, то можна одночасно вивчати і Ruby і Rails.

На просторах інтернету існують тисячі статей, в яких описано створення RoR блогу за 15 хвилин (зізнаюся чесно: коли я починав, укластися в 15 хвилин жодного разу не виходило). Ви можете використовувати будь-гайд, який вам сподобається. У своїй статті я наведу деякі спостереження, рекомендації та список основних гемов (або gems — так у рубі називаються бібліотеки), які бажано мати в своєму пет-проекті і якими потрібно вміти користуватися, якщо ви плануєте працювати на RoR.

Для початку, хочу поділитися двома джерелами, які я застосовую в роботі:

Налаштування оточення

Першим ділом потрібно налаштувати оточення. Кращими операційними системами будуть Linux (наприклад, Ubuntu) і Mac OS. Ситуація з Windows на даний момент йде не кращим чином, і я б не рекомендував витрачати свій час і нерви, хоча в майбутньому все може змінитися. Нещодавно компанія Microsoft випустила оновлення для Windows 10, яка дозволяє встановити «Bash on Ubuntu on Windows Linux Subsystem». Але навіть саме формулювання звучить моторошно, і поки що все працює нестабільно, так що залишається сподіватися і чекати.

Хороший ресурс для налаштування оточення — Go Rails . Тут описані налаштування для Ubuntu, Mac OS і Windows. Ресурс в цілому корисний і вартий місця в скарбничці корисних посилань RoR-розробника.

Цікаве спостереження.Перші кілька разів налаштування оточення рідко закінчуються успіхом, може знадобитися не одна спроба. У той же час всі ті помилки, які ви зробите в початку необхідні, щоб ніколи більше до них не повертатися. Найчастіше ці помилки відбуваються із-за пропуску одного з пунктів. Також, якщо ви використовуєте RVM, раджу використовувати файли .ruby-version і .ruby-gemset. По завершенні установки, ви зможете створювати нові Rails-додатки і запускати сервер.

Корисна інформація.За замовчуванням rails сервер використовує 3000-й порт. Може виникнути ситуація, коли немає можливості натиснути Ctrl+C для зупинки сервера. На допомогу прийде відповідь з ресурсу Stack Overflow .

Установка Ruby Gems в проект

Нижче я наведу список гемов, вміння працювати з якими обов'язково для RoR-розробника будь-якого рівня. Вони дозволять створити своє перше додаток, що володіє достатнім функціоналом для того, щоб можна було задовольнити до 80% вимог замовників.

Для установки Ruby Gems (або гемов) в Rails-проект вам знадобиться утиліта Bundler . Вона управляє версіями гемов і їх залежностями. Список гемов, які застосовуються в проекті, знаходиться в файлі gemfile.

Корисні Ruby Gems

Gem Devise — відмінний гем для створення аутентифікації у вашому додатку. Після установки і деяких махінацій у вас з'явиться можливість реєструватися в системі, логінитися і т. д.

Gem PaperClip — гем для завантаження файлів і зображень. У користувачів, які зареєструвалися через гем Devise, повинна бути можливість додати аватарки.

Gem Kaminari дозволить додати пагінацію в додаток, що дуже корисно. Погодьтеся, що одночасне завантаження тисяч коментарів під статтею зробить бігунок скролла тонкою смужкою, а пошук потрібного коментаря — скрутній завданням.

Gem twitter bootstrap-rails — підключає інструментарій, розроблений компанією Twitter. Включає в себе різні стилі і верстку, застосування яких зробить ваш додаток більш приємним оку.

Gem jquery-rails — JavaScript — це добре, але роботодавці вимагають знання фреймворків, наприклад, jQuery. Використання його спростить роботу з JavaScript і дозволить зробити програму більш динамічним.

Gem cancancan — керує правами доступу до різних ресурсів на сайті, замість того, щоб писати перевірки в кожному методі. Логіка, що контролює доступ, виноситься в окремий файл.

Gems byebug' / 'pry-rails — геми для налагодження і дебаггінга. Дозволяють створювати брейкпоинты в додатку, додаючи виклик методу, де це необхідно.

Gem rspec — потужний інструмент для написання автоматичних тестів.

Gem capistrano — інструмент для деплоя.

Gem mina — геми для деплоя. Локальний сервер — це добре, але толку від нього мало, потрібно, щоб вашим ресурсом користувалися інші люди. Також посилання на свій продукт можна буде вказати в резюме, що значно підвищить вашу цінність.

Gem rubocop — один з найважливіших гемов. У кожної мови — свій style guide (переваги форматування тексту коду). В Ruby це rubocop. Він допоможе вам писати код так, щоб у вас не кидалися камінням люди, які будуть працювати з вашим кодом. Незважаючи на те, що rubocop — всього лише набір побажань до оформлення, на початкових стадіях він може навчити багато чому. Аналізуючи код, він виділяє ті місця, які оформлені невірно, а також пропонує рекомендації по його поліпшенню. Саме ці рекомендації допоможуть вам краще вивчити Ruby. Також деякі правила можна редагувати.

Рекомендації до написання коду

У rubocop вказана максимальна довжина рядка 80 символів, однак для сучасної веб-розробки цього недостатньо. Для більшості випадків 120 символів повинно вистачити.

Може виникнути питання (особливо у людей, що мають досвід роботи з іншими мовами програмування): чому відступ — це два пробілу, а не табуляція? Навколо цього питання часто розпалюються гарячі дискусії. Моя порада: просто прийміть цей факт і не витрачайте час на роздуми і суперечки.

Існує обмеження кількості рядків у методі, і для цього є вагома причина. Потрібно дотримуватися принципу єдиної відповідальності (перша буква акронім SOLID). Якщо метод занадто великий — він виконує зайву роботу і вимагає рефакторінгу.

Хороший приклад вказаний у книзі Сенді Метц «Ruby. Об'єктно-орієнтоване проектування» :

def diameters
 wheels.collect do |wheel|
 wheel.rim + (wheel.tire * 2)
end
end

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

 # обхід всіх елементів масиву
 def diameters
 wheels.collect { |wheel| diameter(wheel) }
end

 # обчислення одного діаметра колеса
 def diameter(wheel)
 wheel.rim + (wheel.tire * 2)
end

Подібне розділення методів не тільки буде відповідати принципу єдиної відповідальності, а також буде простіше підтримувати такий код і не виходити за обмеження, накладені рубокопом.

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

В реальному житті існують трохи інші ситуації. Наприклад:

class Gear
 # . . . 

 # Передавальне відношення в дюймах
 def gear_inches
 ratio * diameter

 # Діаметр колеса
 def diameter
 wheel.rim + (wheel.tire * 2)
end

 # . . .
end

В даному класі велосипедної передачі обчислюється передавальне відношення, яке використовується для порівняння велосипедів, відрізняються як передачами, так і розмірами коліс. Також у ньому є метод, высчитывающий діаметр колеса, — логічніше було б винести в клас Wheel. Однак варто створювати окремий клас заради одного методу, який використовується в єдиному випадку? Чи окупляться сили на це користю, яку принесе така зміна?

В реальній роботі подібні питання часто постають перед розробником. Кращим рішенням буде зачекати надходження додаткової інформації. Можливо, доведеться взагалі прибрати розрахунок діаметра і замінити його готовим значенням, яке буде вводити користувач. Також можуть з'явитися додаткові вимоги, для яких будуть необхідні не тільки обчислення діаметра колеса, а й інших функцій, що стосуються колеса. Коли майбутні втрати від бездіяльності дорівнюють вартості докладених зусиль сьогодні, відкладіть рішення. Приймайте його тільки тоді, коли надійшла до вас інформація вимагає зробити це негайно.

Разом

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

Опубліковано: 23/02/18 @ 11:00
Розділ Блоги

Рекомендуємо:

Мої спостереження про Кремнієвій долині: міфи vs реальність
Шлях стажиста: ELEKS
DOU Проектор: «Лунотека» — безкоштовний коворкінг у КНУ
Туди і назад: чому українські розробники повертаються в Україну після еміграції
Go дайджест #1: Go 1.10rc2, dep dependency management, SOLID в Go