Оглавление.

00:10 — Генерация модели при помощи действия «Run Anything».
01:30 — Автодополнение кода.
02:35 — Действие «Go to definition».
04:06 — Быстрый просмотр документации.
04:36 — Постфиксное дополнение кода.
05:22 — Интеграция RuboCop и intention-действия (быстрые исправления).
08:20 — Show Recent/Recently Edited Files.
09:04 — Проверка регулярных выражений.
09:58 — Окно File Structure.
10:39 — Форматирование кода и настройки стиля кода.
12:10 — Действие «Go to related symbol» (переход к взаимосвязанной сущности Rails).
12:40 — Навигация между методами в редакторе.
12:51 — Рефакторинг «Extract Method».
14:15 — Рефакторинг: Rename.
15:50 — Мультикурсоры.

Генерация модели при помощи действия «Run Anything».

Давайте создадим новую модель, добавим в нее содержимое и рассмотрим различные возможности редактирования RubyMine. Чтобы вызвать действие Run Anything, дважды нажмем Control. Это действие позволяет запускать любые конфигурации, скрипты, команды, задачи Rake, генераторы Rails и даже консольные команды.

К примеру, попробуем ввести “rails g model” или же просто “Model” — RubyMine поймет, что мы ищем генератор модели и предложит его в качестве варианта автодополнения.

Нажмем Enter — откроется интерфейс генератора модели. Такой же интерфейс откроется при создании контроллеров, миграций и других генераторов.

Здесь мы можем указать название модели и ее поля. Назовем нашу модель «Post» и добавим поле “content: text”. Как видите, RubyMine предлагает варианты автодополнения для типов полей. Также добавим поле “picture: string”. Мы можем указать и дополнительные параметры. Но сейчас пропустим это и нажмем OK.

IDE запустит генератор, а затем откроет окно Run, покажет результат выполнения команды и позволит напрямую перейти в созданные файлы. Также в редакторе по умолчанию откроется файл миграции и модель Post.

Закроем окно Run. Теперь мы готовы наполнить нашу новую модель содержимым. Добавим несколько ассоциаций. Для начала соотнесем модель Post с пользователем при помощи ассоциации “belongs_to”.

Автодополнение кода.

Благодаря индексации, которую RubyMine выполняет при каждом запуске приложения, нам доступен набор возможностей по анализу кодаю Например, это автодополнение классов, методов и других сущностей, объявленных в приложении, а также в Ruby, Rails и других гемах.

Вот так выглядит автодополнение для ассоциации “belongs_to”. RubyMine поймет, что нам нужна модель. Нам действительно нужна пользовательская модель, поэтому мы также выполним автодополнение.

Наше приложение использует гем carrierwave для загрузки изображений. Чтобы ассоциировать изображения с нашей моделью, нам понадобится метод гема, который называется “mount_uploader”. И, поскольку гем уже содержится в приложении, RubyMine предложит этот метод в качестве варианта автодополнения.

Помимо автодополнения кода в RubyMine есть и другие функции анализа кода. Важнейшей является возможность навигации к определению любой сущности, объявленной внутри либо вне приложения. Например, мы можем быстро перейти к определению пользовательской модели. Для этого нужно навести мышь на название модели, нажать Control либо Command (в зависимости от вашей операционной системы) и затем кликнуть по названию.

Теперь мы перешли к модели и можем добавить сюда ассоциацию. Переход к определению ассоциации “belongs_to” выполняется точно так же. В результате мы перейдем к гему active record в файле associations.rb (это можно видеть в окне Project).

Теперь мы находимся вне приложения. Точно так же мы можем перейти и к этому методу (гем carrierwave) в файле activerecord.rb.

Добавим метод, который будет проверять размер изображения и выдавать ошибку в случае, если он превышает лимит. Назовем метод picture_size: “picture.size > 5.megabytes”. Кажется, теперь у нас есть два похожих метода. Что если мы не знаем, какой из них использовать? Вместо того, чтобы обращаться к Google, мы можем нажать F1 для быстрого просмотра документации метода прямо из IDE.

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

Постфиксное дополнение кода.

Похоже, что мы забыли обернуть строку в оператор if. Чтобы поправить это, нам не нужно возвращаться наверх. Достаточно поставить точку (.) и написать if, а далее IDE поможет нам обернуть текущую строку в оператор if: “if picture.size> 5.megabytes”. Эта возможность называется постфиксным дополнением и позволяет менять, дополнять и инвертировать операторы, не возвращаясь к уже написанному коду.

Список шаблонов постфиксного кода для JavaScript и Ruby приведен в настройках. Вы можете посмотреть, как они выглядят, и включить/отключить любые из них на свое усмотрение.

Интеграция RuboCop и intention-действия (быстрые исправления).

Теперь допишем наш метод. Повторно включим RuboCop, чтобы узнать, нет ли в нашем коде проблем со стилем. Как, видим, их несколько. Наводя курсор на подсвеченные области в правой части редактора, вы можете просмотреть описания всех ошибок. Для просмотра описания также можно навести курсор непосредственно на подсвеченный код.

Это можно сделать и без помощи мыши: нажимая F2, вы можете переходить от одной ошибки к другой, а нажав Control+F1 или Command+F1 — просмотреть описание ошибки.

В нашем случае ошибкой является использование двойных кавычек вместо одинарных. RuboCop позволяет исправить это: мы можем нажать Alt+Enter и исправить все проблемы найденные RuboCop в файле, либо исправить только проблемы определенного типа, либо воспользоваться cop department. Исправим все проблемы, найденные RuboCop в этом файле.

Отлично. Проблема исчезла. Но у нас осталось несколько других. Мы используем многострочный оператор вместо однострочного. У RuboCop нет соответствующего быстрого исправления, но зато оно есть у RubyMine.

Чтобы выполнить его, еще раз нажмем Alt +Enter. Как видите, мы можем преобразовать оператор в модификатор, то есть сделать оператор if однострочным. Нажмем Enter — ошибка исчезла.

Однако RuboCop утверждает, что у нас есть еще пара проблем. Во-первых, эта строка стала слишком длинной. Во-вторых, у нашего класса нет документирующего комментария. Сделаем так, чтобы среда проигнорировала эти проблемы. Для этого создадим дополнительный конфигурационный файл RuboCop.

Поместим файл .rubocop.yml в корень проекта. RubyMine предложит добавить новый файл в Git. Пока что ответим «Да». Возможности VCS мы обсудим чуть позже.

Добавим несколько дополнительных правил, благодаря которым RuboCop проигнорирует наши проблемы. Теперь вернемся к модели. Сохраним файл вручную, чтобы быстрее применить изменения. Как видите, RubyMine учел конфигурационный файл RuboCop, и ошибки исчезли.

Обратимся к другим возможностям RubyMine. Вы могли заметить, что у нас каким-то образом закрылись все файлы, кроме того, который в данный момент открыт в редакторе. Чтобы сделать это, нужно навести курсор на вкладку, зажав клавишу Alt, и нажать кнопку Close. Так вы закроете все файлы кроме текущего. Но сейчас я хотел бы закрыть текущий тоже. Закроем и окно Project.

Show Recent/Recently Edited Files.

Нам нужно перейти к нашей пользовательской модели. Для этого можно использовать еще одно удобное окно — Recent Files. Чтобы открыть его, нажмите Control+E либо Command+E (в зависимости от вашей операционной системы). Окно позволяет выполнять навигацию к файлам, которые вы недавно открывали. Здесь также работает поиск. Мы можем выполнить что-то подобное, но результатом будет другое (но похожее) окно — Recently Edited Files, ведь, как вы помните, мы действительно редактировали нашу пользовательскую модель (добавили в нее ассоциацию).

Проверка регулярных выражений.

Продолжим чистку. RuboCop показывает, что есть еще несколько проблем. В данном случае нам снова пригодятся intention-действия RubyMine. У нас есть регулярное выражение, которое проверяет корректность указанного пользователем адреса электронной почты. Проверим имеющееся регулярное выражение: для этого нужно нажать Alt+Enter, выбрать Check RegExp и затем ввести само выражение. Данное выражение не проходит проверку. И это тоже. Попробуем ввести name@email.com — подходит. Отлично. Так и выполняется проверка регулярных выражений.

Кроме того, здесь мы можем заменить имя класса на self, а также избавиться от тернарного оператора, который используется для многострочных операторов, сделав из него оператор if/end.

Окно File Structure.

Итак, у нас есть довольно большая модель. Чтобы быстрее переходить между методами модели, будем использовать окно File Structure. Оно позволяет выполнять навигацию между различными методами в файле, а также выполнять поиск. Попробуем перейти к некоторым закрытым методам.

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

Форматирование кода и настройки стиля кода.

У RubyMine есть встроенный инструмент форматирования. Он позволяет выполнять переформатирование кода в соответствии с Ruby Style Guide и теми параметрами, которые прописаны в настройках.

Чтобы выполнить переформатирование кода, нужно перейти в Code | Reformat Code либо использовать соответствующее сочетание клавиш. Как видите, RubyMine переформатировал наши закрытые методы и привел их стиль в соответствие со стилем остальных методов.

Кстати, если мы выделим тот или иной метод и вызовем действие Reformat, RubyMine выполнит переформатирование только в пределах выделенного фрагмента.

RubyMine добавил отступ к нашим закрытым методам, так как теперь это прописано в настройках. Перейдем в настройки, найдем Code Style. Выберем язык Ruby. Перед нами набор настроек стиля для разных языков и технологий. В разделе Ruby мы можем указать, хотим ли мы дополнительный отступ для закрытых и защищенных методов или нет. Панель Preview отображает, что именно меняют данные настройки.

Здесь есть и другие настройки стиля. Например, мы можем настроить добавление пробелов вокруг хэш-ракет, фигурных скобок, хешей и др.

Нажмем Apply и OK. Выполним переформатирование нашего кода еще раз. Как видите, теперь RubyMine добавляет закрытым методам дополнительный отступ.

Действие «Go to related symbol» (переход к взаимосвязанной сущности Rails).

Давайте просмотрим все сущности, которые имеют отношение к пользователю. Для этого перейдем в Navigate | Related Symbol.... В открывшемся окне будут показаны все сущности, связанные с пользователем. В нашем случае это пользовательский контроллер, один вспомогательный метод, несколько представлений и тесты. Перейдем к контроллеру.

Навигация между методами в редакторе.

RuboCop утверждает, что у нас снова есть ряд проблем. Давайте исправим все проблемы за раз. У нас есть набор действий Rails. Кстати, чтобы переходить между различными действиями и методами, можно использовать Control+⇧ и Control+⇩ либо Alt+⇧ и Alt+⇩ (в зависимости от вашей операционной системы).

Рефакторинг «Extract Method».

Похоже, что, выполняя различные действия, мы часто делаем одно и то же: находим пользователя по ID и присваиваем его переменной экземпляра user. Почему бы нам не вынести этот фрагмент кода в отдельный метод?

Для этого перейдем в меню Refactor и выберем окно Refactor. Как видите, RubyMine предоставляет целый набор различных рефакторингов. К примеру, можно извлечь переменную, константу или поле. Для всех этих действий есть соответствующие сочетания клавиш. Выберем рефакторинг «Extract Method».

Методы могут быть закрытыми, открытыми либо защищенными. Сделаем наш метод закрытым. Назовем его get_user. Нажмем OK.

RubyMine найдет все действия, которые используют вынесенный нами фрагмент кода. Нажав «Yes», мы сможем применить новый метод к каждому действию поочередно либо ко всем сразу.

Итак, наш новый метод находится в разделе закрытых методов. Вот он. Теперь все действия Rails будут вместо данного фрагмента кода использовать новый метод. Однако есть небольшая проблема. Нам не стоило бы использовать get в качестве префикса метода — это нарушает принятый стиль. Поэтому назовем метод как-нибудь по-другому.

Рефакторинг «Rename».

Нам не нужно делать это вручную — у RubyMine есть специальный рефакторинг Rename. Нажав Shift+F6, мы сможем переименовать наш метод. Назовем его take_user. Нажмем Refactor. RubyMine найдет все использования, и, если мы нажмем do refactor, среда заменит название метода везде, где он используется.

Как видите, метод теперь отображается как take_user во всех действиях Rails.

Нам не хотелось бы использовать один и тот же метод в различных действиях. Очевидно, что это дублирование. Нам нужно превратить его в фильтр — фильтр before.

Вернемся сюда и продублируем эту строку, нажав Control+D либо Command+D (в зависимости от вашей операционной системы). Сделаем из нашего метода фильтр before. Как видите, теперь для take_user доступно автодополнение.

Вряд ли мы вспомним все действия, которые используют этот метод, поэтому еще раз выполним поиск использований, нажав Alt+F7. Действие встречается в edit, followers, following, show и update. Отлично. Добавим их.

Мультикурсоры.

Теперь мы наконец можем избавиться от вхождений take_user. Они нам больше не нужны, так как теперь у нас есть фильтр before. Но вовсе не обязательно делать это вручную. Нам просто нужно выбрать одно из вхождений take_user и нажать Control+G или Alt+J (в зависимости от вашей операционной системы).

Будем нажимать это сочетание для каждого вхождения take_user в файле. Кажется, мы случайно выбрали и определение метода take_user. Нам не нужно его стирать, поэтому снимем с него выбор.

Для этого используем то же сочетание клавиш, дополнительно удерживая Shift. Теперь, чтобы избавиться от лишних вызовов метода take_user, достаточно нажать Command+Backspace.

И наконец нажмем Escape, чтобы выключить мультикурсоры.