Ruby on Rails
отладка
Поиск…
Отладочное приложение Rails
Чтобы иметь возможность отлаживать приложение, очень важно понять поток логики и данных приложения. Это помогает решать логические ошибки и повышает ценность опыта программирования и качества кода. Двумя популярными камнями для отладки являются отладчик (для ruby 1.9.2 и 1.9.3) и byebug (для ruby> = 2.x).
Для отладки файлов .rb выполните следующие действия:
- Добавить
debuggerилиbyebugв группуdevelopmentGemfile - Запустить
bundle install - Добавить
debuggerилиbyebugв качестве точки останова - Запустить код или сделать запрос
- См. Журнал сервера rails, остановленный в указанной точке останова
- На этом этапе вы можете использовать свой серверный терминал так же, как
rails consoleи проверить значения переменной и params - Для перехода к следующей инструкции введите
nextкоманду и нажмите клавишуenter - Для выхода из типа
cи нажмитеenter
Если вы хотите отлаживать файлы .html.erb , точка .html.erb будет добавлена как <% debugger %>
Отладка в вашей среде IDE
Каждая хорошая среда IDE предоставляет графический интерфейс для интерактивной отладки приложений Ruby (и, таким образом, Rails), где вы можете добавлять точки останова, часы, автоматически приостанавливать выполнение исключения и позволяет выполнять выполнение кода поэтапно, по очереди.
Например, взгляните на одну из лучших Ruby IDE, функции отладки RubyMine на картинке
Отладка Ruby on Rails Быстро + советы для начинающих
Отладка путем повышения исключений гораздо проще , чем щурясь через print заявления журнала, и для большинства ошибок, его намного быстрее , чем открытие КРП отладчик , как pry или byebug . Эти инструменты не должны быть вашим первым шагом.
Отладка Ruby / Rails быстро:
1. Быстрый метод: Поднимите Exception затем и .inspect его результат.
Самый быстрый способ отладки Ruby (особенно Rails) код для raise исключения по пути выполнения вашего кода при вызове .inspect на метод или объект (например , foo ):
raise foo.inspect
В приведенном выше коде raise вызывает триггеры Exception которые останавливают выполнение вашего кода , и возвращает сообщение об ошибке, которое удобно содержит .inspect информацию об объекте / методе (т.е. foo ) в строке, которую вы пытаетесь отлаживать.
Этот метод полезен для быстрого изучения объекта или метода ( например, это nil ? ) И для немедленного подтверждения того, что строка кода даже вообще выполняется в рамках данного контекста.
2. Запасной: Используйте рубиновый IRB отладчик как byebug или pry
Только после того, как у вас есть информация о состоянии вашего кодов потока выполнения вы должны рассмотреть вопрос о переходе на рубин драгоценный камень IRB отладчик , как pry или byebug , где вы можете углубиться в состояние объектов в пределах вашего пути выполнения.
Чтобы использовать камень byebug для отладки в Rails:
- Добавить
gem 'byebug'внутри группы разработки в вашем Gemfile - Запустить
bundle install - Затем, чтобы использовать, вставьте фразу
byebugвнутри пути выполнения кода, который вы хотите проверить.
Эта переменная byebug при ее byebug откроет рубиновый IRB-сеанс вашего кода, давая вам прямой доступ к состоянию объектов, поскольку они находятся в этой точке выполнения кода.
Отладчики IRB, такие как Byebug, полезны для глубокого анализа состояния вашего кода по мере его выполнения. Тем не менее, они более трудоемкие процедуры по сравнению с повышением ошибок, поэтому в большинстве ситуаций они не должны быть вашим первым шагом.
Общий совет для начинающих
Когда вы пытаетесь отладить проблему, рекомендуется всегда: читать сообщение об ошибке @ @ $ $ Error (RTFM)
Это означает, что вы читаете сообщения об ошибках тщательно и полностью, прежде чем действовать, чтобы вы поняли, что он пытается сказать вам. Когда вы отлаживаете ошибку, задайте следующие психические вопросы в этом порядке при чтении сообщения об ошибке:
- Какой класс ссылается на ошибку? (т. е. есть ли у меня правильный класс объекта или мой объект
nil? ) - Какой метод ссылается на ошибку? (т. е. является их типом в методе, можно ли вызвать этот метод для этого типа / класса объекта? )
- Наконец, используя то, что я могу сделать из моих последних двух вопросов, какие строки кода следует исследовать? (помните: последняя строка кода в трассировке стека не обязательно там, где проблема лежит.)
В трассировке стека обратите особое внимание на строки кода, которые приходят из вашего проекта (например, строки, начинающиеся с app/... если вы используете Rails). В 99% случаев проблема связана с вашим собственным кодом.
Чтобы проиллюстрировать, почему интерпретация в этом порядке важна ...
Например, сообщение об ошибке Ruby, которое путает многих новичков:
Вы выполняете код, который в какой-то момент выполняется как таковой:
@foo = Foo.new
...
@foo.bar
и вы получите сообщение об ошибке:
undefined method "bar" for Nil:nilClass
Начинающие видят эту ошибку и считают, что проблема в том, что bar методов не определена . Это не. В этой ошибке реальная часть имеет значение:
for Nil:nilClass
for Nil:nilClass означает, что @foo - это Nil! @foo не является переменной экземпляра Foo ! У вас есть объект, который является Nil . Когда вы видите эту ошибку, просто ruby пытается сказать вам, что bar методов не существует для объектов класса Nil . (ну, так как мы пытаемся использовать метод для объекта класса Foo не Nil ).
К сожалению, из - за того , как эта ошибка записывается ( не undefined method "bar" for Nil:nilClass ) его легко получить обмануты, думая , эту ошибку нужно делать с bar является undefined . Когда вы не читаете внимательно, эта ошибка заставляет новичков ошибочно переходить к деталям метода bar на Foo , полностью упуская часть ошибки, которая подсказывает, что объект имеет неправильный класс (в данном случае: nil). Это ошибка, которую легко избежать, читая сообщения об ошибках полностью.
Резюме:
Всегда внимательно прочитайте все сообщение об ошибке перед началом любой отладки. Это означает: всегда проверяйте тип класса объекта в сообщении об ошибке сначала , а затем его методы , прежде чем приступать к любому стеку или строке кода, где, по вашему мнению, может возникнуть ошибка. Эти 5 секунд могут сэкономить вам 5 часов разочарования.
tl; dr: Не косоглазие в журналах печати: вместо этого выведите исключения. Избегайте кроличьих отверстий, тщательно читая ошибки перед отладкой.
Отладка приложения ruby-on-rails с помощью pry
pry - мощный инструмент, который можно использовать для отладки любого рубинового приложения. Настройка приложения ruby-on-rails с помощью этого драгоценного камня очень проста и понятна.
Настроить
Чтобы начать отладку приложения с помощью pry
- Добавьте
gem 'pry'вGemfileприложения иGemfileего
group :development, :test do
gem 'pry'
end
- Перейдите в корневой каталог приложения на консоль терминала и выполните
bundle install. Вы все можете начать использовать его в любом месте приложения.
использование
Использование pry в вашем приложении просто включает binding.pry на контрольных точках, которые вы хотите проверить во время отладки. Вы можете добавить binding.pry точку останова в любом месте вашего приложения , которое интерпретируется рубиновым переводчиком (любое приложение / контроллеры, приложение / модель, приложение / файлы просмотры)
i) Отладка контроллера
приложение / контроллеры / users_controller.rb
class UsersController < ApplicationController
def show
use_id = params[:id]
// breakpoint to inspect if the action is receiving param as expected
binding.pry
@user = User.find(user_id)
respond_to do |format|
format.html
end
end
end
В этом примере сервер rails приостанавливается с помощью штыревой консоли в точке разрыва при попытке посетить маршрутизацию страницы, чтобы show действие на UsersController . Вы можете проверить объект params и сделать запрос ActiveRecord на модели User с этой точки останова
ii) Отладка представления
приложение / просмотров / пользователей / show.html.haml
%table
%tbody
%tr
%td ID
%td= @user.id
%tr
%td email
%td= @user.email
%tr
%td logged in ?
%td
- binding.pry
- if @user.logged_in?
%p= "Logged in"
- else
%p= "Logged out"
В этом примере точка прерывания приостанавливается с помощью консоли pry, когда страница users/show предварительно скомпилирована на сервере rails, прежде чем отправлять ее обратно в браузер клиента. Эта точка прерывания позволяет отлаживать правильность @user.logged_in? когда это плохо.
ii) Отладка модели
app/models/user.rb
class User < ActiveRecord::Base
def full_name
binding.pry
"#{self.first_name} #{self.last_name}"
end
end
В этом примере точка прерывания может использоваться для отладки имени full_name экземпляра модели User full_name когда этот метод вызывается из любого места приложения.
В заключение, pry - мощный инструмент для отладки для приложения rails с простой настройкой и простой инструкцией по отладке. Попробуй.
