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

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

Итого

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

Похожие статьи:
Компания HTC опубликовала квартальный финансовый отчет по итогам третьего квартала текущего года. За прошедшие три месяца динамика...
If you are looking for guidance on how to convert YouTube videos to MP3 and MP4, you have come to the right place. Many years ago, it used to be quite a laborious and complicated procedure to convert a YouTube video, but now there are many...
В сети появилась информация о смартфоне HTC One X9, который, очевидно, в скором времени будет представлен. Судя по характеристикам, это...
Не так давно крупнейшая IT-компания «Яндекс» заявила о отключении сервиса счётчиков просмотров. По словам специалистов...
Херсонець Максим Мисников після школи обрав своєю майбутньою професією морську справу. З 2018-го працював електромеханіком...
Яндекс.Метрика