Статьи

Прай (и Друзья) с Рельсами

pryandrails

В моей предыдущей статье мы рассмотрели 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 будет заменена чем-то намного, намного лучше:

img

Завершение

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

Приятного любопытства!