Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

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.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
626 views
Welcome To Ask or Share your Answers For Others

1 Answer

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...