В моей предыдущей статье мы рассмотрели 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.
Приятного любопытства!

