Making reload! work in Pry with Rails 3.2#
Mon, 23 Jan 2012 14:08:41 +0000
As of Pry 0.9.7.4 (the current version according to Bundler at the
time I write this), the setup instructions for replacing irb with Pry
when you run rails console
no longer work fully in Rails 3.2.
Specifically, the Rails team have changed the way they create irb
commands like reload!
: where in earlier version they were added to
Object
, now they are added to IRB::ExtendCommandBundle
to avoid
polluting the global namespace. Here's the github pull request where the change is described.
(The cynic here will say "Rails? Namespace pollution? Lost cause, mate", but hey, let's not be down on attempts to make it better)
IRB already knows how to look in IRB::ExtendCommandBundle
; Pry
doesn't, so what will happen if you have installed Pry in the usually
recommended
way
by assigning IRB=Pry
is you'll get an error that Pry::ExtendCommandBundle
doesn't exist.
(I've seen 'fixes' for this bug that assign
Pry::ExtendCommandBundle=Pry
. This will make rail console
start,
but it still doesn't make the commands accessible. Less than
entirely useful then)
So, let's make it so. Here's the relevant bit of my config: feel free to use as inspiration, but don't blame me if copy/paste doesn't work
First, in config/environments/development.rb
silence_warnings do begin require 'pry' IRB = Pry module Pry::RailsCommands ;end IRB::ExtendCommandBundle = Pry::RailsCommands rescue LoadError end end
and then in $HOME/.pryrc
we create commands for the methods in that module
if Kernel.const_defined?("Rails") then require File.join(Rails.root,"config","environment") require 'rails/console/app' require 'rails/console/helpers' Pry::RailsCommands.instance_methods.each do |name| Pry::Commands.command name.to_s do Class.new.extend(Pry::RailsCommands).send(name) end end end
If you are using a newer version of Pry than me - well, first off,
they may have fixed this already and if so you can ignore this whole
post. But if they haven't, and if Pry::Commands.command
is giving
you trouble, note that the unreleased Pry 0.9.8 is set to include a
new way of defining custom commands and you may need to rewrite this
using the new Pry::Commands.block_command
construct instead.
HTH