23

When I require a file, for example (called st.rb):

require 'rubygems' require 'mongrel' class TestHandler < Mongrel::HttpHandler def process(request, response) response.start(200) do |head, out| head["Content-Type"] = "text/html" out.write "Hello, World!\n" end end end 

in irb I get:

>> require 'st.rb' LoadError: cannot load such file -- st.rb from /usr/local/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require' from /usr/local/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require' from (irb):3 from /usr/local/bin/irb:12:in `<main>' 

I might have a clue, but it's just a guess. My ruby version/install location is:

/usr/local/bin/ruby and ruby 1.9.3p0

yet, ruby gems is in /usr/local/lib/ruby/1.9.1 and it's talking about version 1.9.1. Could this possibly be the reason?

Thanks!

UPDATE Weird, when I type 'puts RUBY_VERSION' in IRB, I get this:

puts RUBY_VERSION 1.9.3 NoMethodError: undefined method `write' for nil:NilClass from /usr/local/lib/ruby/1.9.1/irb.rb:311:in `printf' from /usr/local/lib/ruby/1.9.1/irb.rb:311:in `output_value' from /usr/local/lib/ruby/1.9.1/irb.rb:160:in `block (2 levels) in eval_input' from /usr/local/lib/ruby/1.9.1/irb.rb:273:in `signal_status' from /usr/local/lib/ruby/1.9.1/irb.rb:156:in `block in eval_input' from /usr/local/lib/ruby/1.9.1/irb/ruby-lex.rb:243:in `block (2 levels) in each_top_level_statement' from /usr/local/lib/ruby/1.9.1/irb/ruby-lex.rb:229:in `loop' from /usr/local/lib/ruby/1.9.1/irb/ruby-lex.rb:229:in `block in each_top_level_statement' from /usr/local/lib/ruby/1.9.1/irb/ruby-lex.rb:228:in `catch' from /usr/local/lib/ruby/1.9.1/irb/ruby-lex.rb:228:in `each_top_level_statement' from /usr/local/lib/ruby/1.9.1/irb.rb:155:in `eval_input' from /usr/local/lib/ruby/1.9.1/irb.rb:70:in `block in start' from /usr/local/lib/ruby/1.9.1/irb.rb:69:in `catch' from /usr/local/lib/ruby/1.9.1/irb.rb:69:in `start' from /usr/local/bin/irb:12:in `<main>' Maybe IRB bug! >> 
2

5 Answers 5

22

The directory where st.rb lives is most likely not on your load path.

Assuming that st.rb is located in a directory called lib relative to where you invoke irb, you can add that lib directory to the list of directories that ruby uses to load classes or modules with this:

$: << 'lib' 

For example, in order to call the module called 'foobar' (foobar.rb) that lives in the lib directory, I would need to first add the lib directory to the list of load path. Here, I am just appending the lib directory to my load path:

irb(main):001:0> require 'foobar' LoadError: no such file to load -- foobar from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:36:in `gem_original_require' from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:36:in `require' from (irb):1 irb(main):002:0> $: => ["/usr/lib/ruby/gems/1.8/gems/spoon-0.0.1/lib", "/usr/lib/ruby/gems/1.8/gems/interactive_editor-0.0.10/lib", "/usr/lib/ruby/site_ruby/1.8", "/usr/lib/ruby/site_ruby/1.8/i386-cygwin", "/usr/lib/ruby/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i386-cygwin", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i386-cygwin", "."] irb(main):004:0> $: << 'lib' => ["/usr/lib/ruby/gems/1.8/gems/spoon-0.0.1/lib", "/usr/lib/ruby/gems/1.8/gems/interactive_editor-0.0.10/lib", "/usr/lib/ruby/site_ruby/1.8", "/usr/lib/ruby/site_ruby/1.8/i386-cygwin", "/usr/lib/ruby/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i386-cygwin", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i386-cygwin", ".", "lib"] irb(main):005:0> require 'foobar' => true 

EDIT Sorry, I completely missed the fact that you are using ruby 1.9.x. All accounts report that your current working directory has been removed from LOAD_PATH for security reasons, so you will have to do something like in irb:

$: << "." 
Sign up to request clarification or add additional context in comments.

1 Comment

I am currently cd'ed into the directory in which st.rb resides. This was working fine until yesterday when i decided to upgrade ruby to 1.9.3
14

The problem shall have solved if you specify your path. For example,

require 'st.rb' --> require './st.rb'

See if your problem get solved or not.

1 Comment

Thx. I came thru the problem when working on the samples of AWS. In fact, if we tried to match the version of ruby when the sample code, the problem may disappeared.
11

For security & other reasons, ruby does not by default include the current directory in the load_path. You may want to check this for more details - Why does Ruby 1.9.2 remove "." from LOAD_PATH, and what's the alternative?

Comments

2

I created my own Gem, but I did it in a directory that is not in my load path:

$ pwd /Users/myuser/projects $ gem build my_gem/my_gem.gemspec 

Then I ran irb and tried to load the Gem:

> require 'my_gem' LoadError: cannot load such file -- my_gem 

I used the global variable $: to inspect my load path and I realized I am using RVM. And rvm has specific directories in my load path $:. None of those directories included my ~/projects directory where I created the custom gem.

So one solution is to modify the load path itself:

$: << "/Users/myuser/projects/my_gem/lib" 

Note that the lib directory is in the path, which holds the my_gem.rb file which will be required in irb:

> require 'my_gem' => true 

Now if you want to install the gem in RVM path, then you would need to run:

$ gem install my_gem 

But it will need to be in a repository like rubygems.org.

$ gem push my_gem-0.0.0.gem Pushing gem to RubyGems.org... Successfully registered gem my_gem 

Comments

1

I just came across a similar problem. Try

require './st.rb' 

This should do the trick.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.