Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Route Handlers Inside a Class

Tags:

ruby

sinatra

I have a Sinatra app setup where most of the logic is performed inside of various classes, and the post/get routes instantiate those classes and call their methods.

I'm thinking about whether putting the post/get route handlers inside of the classes themselves would be a better structure.

In any case, I'd like to know if it is possible. So for instance:

class Example
  def say_hello
    "Hello"
  end

  get '/hello' do
    @message = say_hello
  end
end

Without modification to the above, Sinatra will say there is no method say_hello on the SinatraApplication object.

like image 548
dbgpyd Avatar asked Jan 25 '11 08:01

dbgpyd


1 Answers

You just need to inherit from Sinatra::Base:

require "sinatra/base"

class Example < Sinatra::Base
  def say_hello
    "Hello"
  end

  get "/hello" do
    say_hello
  end
end

You can run your app with Example.run!.


If you need more separation between parts of your application, just make another Sinatra app. Put shared functionality in model classes and helpers, and run all your apps together with Rack.

module HelloHelpers
  def say_hello
    "Hello"
  end
end

class Hello < Sinatra::Base
  helpers HelloHelpers

  get "/?" do
    @message = say_hello
    haml :index
  end
end

class HelloAdmin < Sinatra::Base
  helpers HelloHelpers

  get "/?" do
    @message = say_hello
    haml :"admin/index"
  end
end

config.ru:

map "/" do
  run Hello
end

map "/admin" do
  run HelloAdmin
end

Install Thin, and run your app with thin start.

like image 78
Todd Yandell Avatar answered Oct 03 '22 15:10

Todd Yandell