Ruby on Rails
отладка
Поиск…
Отладочное приложение Rails
Чтобы иметь возможность отлаживать приложение, очень важно понять поток логики и данных приложения. Это помогает решать логические ошибки и повышает ценность опыта программирования и качества кода. Двумя популярными камнями для отладки являются отладчик (для ruby 1.9.2 и 1.9.3) и byebug (для ruby> = 2.x).
Для отладки файлов .rb
выполните следующие действия:
- Добавить
debugger
илиbyebug
в группуdevelopment
Gemfile
- Запустить
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 с простой настройкой и простой инструкцией по отладке. Попробуй.