В моей предыдущей статье мы рассмотрели Pry, чрезвычайно мощную альтернативу стандартной оболочке IRB, которую дает нам Ruby.
Для тех, кто работает с Rails, вы будете рады узнать, что Pry получил вашу поддержку. В этой статье мы рассмотрим различные способы, которыми Pry значительно улучшает наш рабочий процесс на Rails.
Обратите внимание, что Pry лучше всего работает с Ruby 1.9.3 и выше.
Получение примера приложения
Для нашего примера приложения мы будем использовать приложение, написанное для руководства по Rails 3 Майклом Хартлом.
Чтобы получить приложение:
git clone git@github.com:benjamintanweihao/sample_app.git
Установка Pry с Rails
Вы можете установить pry
на Rails, добавив гем pry pry-rails
в ваш gemfile:
gem 'pry-rails', :group => :development
Или вы можете получить это и другие вкусности с Jazz Hands .
group :development do gem 'jazz_hands' end
Из коробки в комплект поставки Jazz Hands входят не только pry-rails
, но и другие тонкости, такие как:
- Удивительный принт
- Прай Док
- Прай пульт
- Pry Debugger
- Pry Stack Explorer
Как только вы это установили, вернитесь в каталог sample_app
и установите все необходимые зависимости:
bundle install
Настройка базы данных
rake db:schema:load
Обратите внимание, что некоторым из вас может понадобиться добавить префикс вышеупомянутой команды к bundle exec
.
И последнее, прежде чем мы перейдем к забавным .pryrc
: создайте .pryrc
в вашем домашнем каталоге:
% touch ~/.pryrc
Заполните его редактором по вашему выбору:
Pry.config.editor = 'vim'
Запуск Прай
… тривиально Просто сделай
rails c
и вы поприветствовали консоль
% rails c Loading development environment (Rails 3.2.16) Frame number: 0/3 [1] sample_app »
Изучение проекта Rails
Прай дает вам несколько инструментов, чтобы разобраться в проекте, не открывая ни одного файла.
show-models
Первое, что мы сделаем, это посмотрим, какие модели содержит проект. Это именно то, что говорят вам show-models
:
[1] sample_app » show-models Micropost id: integer content: string user_id: integer created_at: datetime updated_at: datetime belongs_to :user Relationship id: integer follower_id: integer followed_id: integer created_at: datetime updated_at: datetime belongs_to :followed belongs_to :follower User id: integer name: string email: string created_at: datetime updated_at: datetime password_digest: string remember_token: string admin: boolean has_many :followed_users (through :relationships) has_many :followers (through :reverse_relationships) has_many :microposts has_many :relationships has_many :reverse_relationships
Очень здорово! Обратите внимание, что вывод имеет довольно симпатичную подсветку синтаксиса.
show-routes
rake routes
это то, что я делаю довольно часто. Иногда, когда я нахожусь в разгар сеанса консоли, может быть довольно неудобно и отвлекает переключение окон / вкладок только для отображения маршрутов.
То есть, пока не появились show-routes
:
[2] sample_app » show-routes following_user GET /users/:id/following(.:format) users#following followers_user GET /users/:id/followers(.:format) users#followers users GET /users(.:format) users#index POST /users(.:format) users#create new_user GET /users/new(.:format) users#new edit_user GET /users/:id/edit(.:format) users#edit user GET /users/:id(.:format) users#show PUT /users/:id(.:format) users#update DELETE /users/:id(.:format) users#destroy sessions POST /sessions(.:format) sessions#create new_session GET /sessions/new(.:format) sessions#new session DELETE /sessions/:id(.:format) sessions#destroy microposts POST /microposts(.:format) microposts#create micropost DELETE /microposts/:id(.:format) microposts#destroy relationships POST /relationships(.:format) relationships#create relationship DELETE /relationships/:id(.:format) relationships#destroy root / static_pages#home signup /signup(.:format) users#new signin /signin(.:format) sessions#new signout DELETE /signout(.:format) sessions#destroy help /help(.:format) static_pages#help about /about(.:format) static_pages#about contact /contact(.:format) static_pages#contact
show-routes
есть еще одна действительно полезная функция: для больших проектов Rails простое отображение всех маршрутов может легко затопить ваш экран и заставить ваши глаза промокнуть.
Давайте выясним, на что еще способны show-routes
route. Префикс команды ?
):
[3] sample_app » ? show-routes From: /usr/local/var/rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/pry-rails-0.3.2/lib/pry-rails/commands/show_routes.rb Number of lines: 6 Usage: show-routes [-G] show-routes displays the current Rails app's routes. -G, --grep Filter output by regular expression -h, --help Show this message.
Итак, если я хочу вспомнить, было ли это sign_up
или signup
, я могу сделать быстрый фильтр:
[3] sample_app » show-routes -G sign signup /signup(.:format) users#new signin /signin(.:format) sessions#new signout DELETE /signout(.:format) sessions#destroy
Чтобы отобразить все действия POST
:
[4] sample_app » show-routes -G POST POST /users(.:format) users#create sessions POST /sessions(.:format) sessions#create microposts POST /microposts(.:format) microposts#create relationships POST /relationships(.:format) relationships#create
Удивительная печать удивительна.
(Примечание: это не часть pry-rails, но устанавливается вместе с Jazz Hands. Вы можете получить awesome_print , установив гем в случае необходимости.)
Когда вы делаете Model.all
, результатом обычно является неразборчивый беспорядок. Вот пример того, как awesome-print
облегчает эту боль (я Micropost
несколько записей Micropost
):
[5] sample_app » Micropost.all Micropost Load (0.2ms) SELECT "microposts".* FROM "microposts" ORDER BY microposts.created_at DESC => [ [0] #<Micropost:0x007ff7dcda7038> { :id => 2, :content => "Sure is! Wait till you combine it with Rails!", :user_id => 1, :created_at => Mon, 27 Jan 2014 15:13:35 UTC +00:00, :updated_at => Mon, 27 Jan 2014 15:13:35 UTC +00:00 }, [1] #<Micropost:0x007ff7dd66e770> { :id => 1, :content => "Hello! Isn't Pry awesome?", :user_id => 1, :created_at => Mon, 27 Jan 2014 15:13:21 UTC +00:00, :updated_at => Mon, 27 Jan 2014 15:13:21 UTC +00:00 } ]
Как только вы привыкнете к этому красиво отформатированному выводу с цветовой кодировкой, вы больше никогда не вернетесь к простой старой rails console
.
show-doc
Не забывайте, что вся документация находится в пределах легкой досягаемости:
[6] sample_app » cd Array [7] sample_app(../Array) » show-doc each_cons From: enum.c (C Method): Owner: Enumerable Visibility: public Signature: each_cons(arg1) Number of lines: 14 Iterates the given block for each array of consecutive <n> elements. If no block is given, returns an enumerator. eg: (1..10).each_cons(3) { |a| pa } # outputs below [1, 2, 3] [2, 3, 4] [3, 4, 5] [4, 5, 6] [5, 6, 7] [6, 7, 8] [7, 8, 9] [8, 9, 10]
Отладка
Прай действительно сияет своими возможностями отладки. Давайте намеренно внесем ошибку в наш проект прямо из Pry.
Сначала перейдите к UsersController
:
[8] sample_app » cd UsersController [9] sample_app(../UsersController) »
show-source
Напомним, что мы можем проверить источник файла с помощью команды show-source
:
[10] sample_app(../UsersController) » show-source From: /Users/rambo/Desktop/sample_app/app/controllers/users_controller.rb @ line 1: Class name: UsersController Number of monkeypatches: 4. Use the `-a` option to display all available monkeypatches Number of lines: 74 class UsersController < ApplicationController before_filter :signed_in_user, only: [:index, :edit, :update, :destroy, :following, :followers] before_filter :correct_user, only: [:edit, :update] before_filter :admin_user, only: :destroy def index @users = User.paginate(page: params[:page]) end def show @user = User.find(params[:id]) @microposts = @user.microposts.paginate(page: params[:page]) end # Other code omitted ... end
edit-method
Теперь давайте представим ошибку в действии index
:
[10] sample_app(../UsersController) » edit index
Обратите внимание, что vim (или любой другой редактор, который вы настроили ранее) отображается с курсором непосредственно в начале определения метода.
Теперь просто добавьте raise
внизу действия index
:
def index @users = User.paginate(page: params[:page]) raise # <-- Add this end
После сохранения и выхода вы вернетесь к консоли.
Отладка с помощью binding.pry
Очевидно, что когда вы перейдете на http://localhost:3000/users
, он взорвется.
Предположим, вы столкнулись с ошибкой в вашем приложении. Вот шаги, которые я обычно делаю:
-
cd
в класс -
edit
оскорбительный метод - добавить
binding.pry
Итак, давайте вернемся в нашу консоль и сделаем именно это:
def index @users = User.paginate(page: params[:page]) binding.pry raise end
На этот раз перейдите по http://localhost:3000/users
. Однако, вместо взрыва, обратите внимание, что браузер просто висит там.
Проверьте окно консоли, где вы запустили сервер rails. Вы заметите, что для вас подготовлена еще одна сессия Pry:
Frame number: 0/66 From: /Users/rambo/Desktop/sample_app/app/controllers/users_controller.rb @ line 9 UsersController#index: 7: def index 8: @users = User.paginate(page: params[:page]) => 9: binding.pry 10: raise 11: end [1] sample_app(#<UsersController>) »
В этом сеансе вы можете легко изучить все переменные в области видимости.
Мы можем проверить содержимое @users
:
[3] sample_app(
Давайте попробуем params
:
[2] sample_app(#<UsersController>) » params => { "action" => "index", "controller" => "users" }
session
тоже работает:
[4] sample_app(#<UsersController>) » session => { "session_id" => "812d9cfb949e795ed2fef78c2188fc0e", "_csrf_token" => "e+MnQKg2URyBEhkXdxpwcmJnyeRT5J+Tc1PGMvYpoU4=" }
Как только вы это сделаете, вы можете пойти дальше и использовать edit method_name
чтобы удалить edit method_name
и raise
.
Также не забудьте exit
, иначе запрос будет заблокирован на неопределенный срок.
Лучшие ошибки
Иногда вам нужно binding.pry
для поиска переменных и методов трассировки. Это также хороший способ произвести впечатление на ваших друзей / коллег по программированию.
Но когда вы закончите с этим, вы скоро поймете, что это постепенно становится проблемой. К счастью, есть драгоценный камень better_errors
, который уничтожает все церемонии.
Установка
group :development do gem "better_errors" gem "binding_of_caller" end
Как отмечает README , не помещайте это в production
группу.
Я снова включил ошибку raise
в UsersController#index
. Если вы посмотрите на браузер, обычная страница ошибок Rails будет заменена чем-то намного, намного лучше:
Завершение
Надеюсь, я еще раз убедил вас в удивительности Pry. Возможно, вы даже вдохновились использовать некоторые из техник, чтобы улучшить рабочий процесс в Rails.
Приятного любопытства!