Как начать писать на 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. Однако стоит ли создавать отдельный класс ради одного метода, который используется в единственном случае? Окупятся ли силы на это пользой, которую принесет подобное изменение?

В реальной работе подобные вопросы часто встают перед разработчиком. Лучшим решением будет подождать поступления дополнительной информации. Возможно, придется вообще убрать расчёт диаметра и заменить его готовым значением, которое будет вводить пользователь. Также могут появиться дополнительные требования, для которых будут необходимы не только вычисления диаметра колеса, а и других функций, касающихся колеса. Когда будущие потери от бездействия равны стоимости приложенных усилий сегодня, отложите решение. Принимайте его только тогда, когда поступившая к вам информация требует сделать это незамедлительно.

Итого

Если хороший способ учиться программированию — это практика, то лучший состоит в том, чтобы найти решение проблемы. Если у вас есть идея приложения, с помощью которого вы можете решить эту проблему, вы будете гораздо более успешны. Как только вы начнете изучать основы, разберитесь, что именно нужно делать и просто примените это на деле. Все хорошие программисты учатся путем проб и ошибок.

Похожие статьи:
Независимо от своего опыта, люди склонны ошибаться, и от этого никто не застрахован. За время своей работы я собрал перечень основных...
Чисті прибутки EPAM скоротилися зі $114,7 млн у другому кварталі 2021-го до $18,6 млн у другому кварталі цього року. Про це йдеться...
В апреле текущего года компания ZTE представила смартфоны Nubia Z9 Max и Nubia Z9 Mini, но теперь, спустя полгода после выхода, решила...
[Про автора: Андрій Ревін — операційний менеджер в OpenVPN Inc, відповідальний за проектний менеджмент компанії...
На сегодня AngularJS самый популярный фреймворk для разработки веб приложений. Согласно ежегодному отчету...
Яндекс.Метрика