views:

18

answers:

1

I want to use the new Rails3 feature that allows you to embed a Sinatra app inside rails.

In my routes file, I have:

# app names changed to protect the (not so) innocent
MyApp::Application.routes.draw do
  match "/service", :to => MyService
  ...
end

And in /lib/my_service.rb I have

class MyService < Sinatra::Base
  get "/" do
    "Hello World"
  end
end

When I try to start the Rails server I get Uninitialized constant MyService (NameError), which I suspect means my Sinatra file is in the wrong directory. Where am I supposed to put it?

Full error text:

rails/my_app » rails server       
=> Booting WEBrick
=> Rails 3.0.1 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
Exiting
/Users/marshallyount/Projects/clients/method/rails/my_app/config/routes.rb:2:in `block in <top (required)>': uninitialized constant MyService (NameError)
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/actionpack-3.0.1/lib/action_dispatch/routing/route_set.rb:233:in `instance_exec'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/actionpack-3.0.1/lib/action_dispatch/routing/route_set.rb:233:in `draw'
 from /Users/marshallyount/Projects/clients/method/rails/my_app/config/routes.rb:1:in `<top (required)>'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/railties-3.0.1/lib/rails/application.rb:127:in `block in reload_routes!'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/railties-3.0.1/lib/rails/application.rb:127:in `each'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/railties-3.0.1/lib/rails/application.rb:127:in `reload_routes!'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/railties-3.0.1/lib/rails/application.rb:120:in `block in routes_reloader'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/activesupport-3.0.1/lib/active_support/file_update_checker.rb:32:in `call'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/activesupport-3.0.1/lib/active_support/file_update_checker.rb:32:in `execute_if_updated'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/actionpack-3.0.1/lib/action_dispatch/railtie.rb:14:in `block (2 levels) in <class:Railtie>'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/activesupport-3.0.1/lib/active_support/callbacks.rb:419:in `_run_prepare_callbacks'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/actionpack-3.0.1/lib/action_dispatch/middleware/callbacks.rb:40:in `initialize'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/actionpack-3.0.1/lib/action_dispatch/middleware/stack.rb:33:in `new'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/actionpack-3.0.1/lib/action_dispatch/middleware/stack.rb:33:in `build'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/actionpack-3.0.1/lib/action_dispatch/middleware/stack.rb:79:in `block in build'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/actionpack-3.0.1/lib/action_dispatch/middleware/stack.rb:79:in `each'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/actionpack-3.0.1/lib/action_dispatch/middleware/stack.rb:79:in `inject'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/actionpack-3.0.1/lib/action_dispatch/middleware/stack.rb:79:in `build'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/railties-3.0.1/lib/rails/application.rb:162:in `app'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/railties-3.0.1/lib/rails/application/finisher.rb:35:in `block in <module:Finisher>'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/railties-3.0.1/lib/rails/initializable.rb:25:in `instance_exec'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/railties-3.0.1/lib/rails/initializable.rb:25:in `run'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/railties-3.0.1/lib/rails/initializable.rb:50:in `block in run_initializers'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/railties-3.0.1/lib/rails/initializable.rb:49:in `each'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/railties-3.0.1/lib/rails/initializable.rb:49:in `run_initializers'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/railties-3.0.1/lib/rails/application.rb:134:in `initialize!'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/railties-3.0.1/lib/rails/application.rb:77:in `method_missing'
 from /Users/marshallyount/Projects/clients/method/rails/my_app/config/environment.rb:5:in `<top (required)>'
 from /Users/marshallyount/Projects/clients/method/rails/my_app/config.ru:3:in `require'
 from /Users/marshallyount/Projects/clients/method/rails/my_app/config.ru:3:in `block in <main>'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/rack-1.2.1/lib/rack/builder.rb:46:in `instance_eval'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/rack-1.2.1/lib/rack/builder.rb:46:in `initialize'
 from /Users/marshallyount/Projects/clients/method/rails/my_app/config.ru:1:in `new'
 from /Users/marshallyount/Projects/clients/method/rails/my_app/config.ru:1:in `<main>'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/rack-1.2.1/lib/rack/builder.rb:35:in `eval'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/rack-1.2.1/lib/rack/builder.rb:35:in `parse_file'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/rack-1.2.1/lib/rack/server.rb:162:in `app'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/rack-1.2.1/lib/rack/server.rb:248:in `wrapped_app'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/rack-1.2.1/lib/rack/server.rb:213:in `start'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/railties-3.0.1/lib/rails/commands/server.rb:65:in `start'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/railties-3.0.1/lib/rails/commands.rb:30:in `block in <top (required)>'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/railties-3.0.1/lib/rails/commands.rb:27:in `tap'
 from /Users/marshallyount/.rvm/gems/ruby-1.9.2-p0@my_app/gems/railties-3.0.1/lib/rails/commands.rb:27:in `<top (required)>'
 from script/rails:6:in `require'
 from script/rails:6:in `<main>'
A: 

I found a good answer for this question, thanks to this article.

I was missing the all important requires header at the top of my routes file:

require 'my_service.rb'

# app names changed to protect the (not so) innocent
MyApp::Application.routes.draw do
  match "/service", :to => MyService
  ...
end
marshally