picardo
picardo

Reputation: 24896

How can I reload a script in IRB?

I am writing a Ruby script for use in the Rails environment, but I chose to run it from irb because reloading the Rails console can be a pain. Now the wait time is much shorter from irb, but I'm bothered that I have to restart irb and require the script everytime I make a change. Is there a simpler way of reloading a script from irb?

I found a method in this thread, but that only applies to gem files apparently. My require statement looks like this

 require "#{File.expand_path(__FILE__)}/../lib/query"

EDIT: Having tried load rather than require, I still couldn't get it to work. I can't get a stop on these errors.

ruby-1.9.2-p0 > load "#{File.expand_path(__FILE__)}/../lib/query.rb"
LoadError: no such file to load -- /Users/newuser/Dropbox/Sites/rails/hacknyc/(irb)/../lib/query.rb

Upvotes: 72

Views: 49146

Answers (5)

Artur INTECH
Artur INTECH

Reputation: 7396

This is what I use to reload a Ruby app:

.irbrc:

def load_app
  load 'app.rb'
end
alias reload_app load_app

require 'irb/helper_method'

class ReloadHelper < IRB::HelperMethod::Base
  description 'Reload application'

  def execute
    reload_app
  end
end

IRB::HelperMethod.register(:reload, ReloadHelper)

load_app

It defines the reload helper which you call by typing reload in an IRB session.

  • It assumes your app resides in app.rb in the same directory as a.irbrc file. It can be a Sinatra app, for example.
  • Originally created constants are not removed.

Upvotes: 0

Alex Wayne
Alex Wayne

Reputation: 187262

In irb, File.expand_path(__FILE__)} will just return "#{path you ran irb from}/(irb)". Which creates a path that doesn't actually exist. Luckily all file paths are relative to where you ran irb anyway. This means all you need is:

load "lib/query.rb"

If you want to use the __FILE__ in an actual file, that's fine, but don't expect it to produce a valid path in irb. Because an irb there is no "file" at all, so it cannot return valid path at all.

Also, __FILE__ will work fine if used in a file loaded into irb via load or require. Cause that's kinda what it's for.

Upvotes: 116

pjammer
pjammer

Reputation: 9577

according to this link you need to load your file and do not forget the extention.

Here is a fancier version to use too at this link number 2 which could be helpful for you too.

You may want to try hashing out why your rails console isn't working for you though.

Upvotes: 3

lukad
lukad

Reputation: 17873

I think load is what you are looking for.

Upvotes: 1

vonconrad
vonconrad

Reputation: 25387

Instead of using require, try load. The former only loads a source file once, while the latter loads it every time you call it.

Upvotes: 43

Related Questions