Обработчики маршрутов внутри класса

У меня есть установка приложения Sinatra, где большая часть логики выполняется внутри разных классов, а трассы post/get создают эти классы и вызывают их методы.

Я думаю о том, будет ли лучшая структура размещения обработчиков маршрутов post/get внутри самих классов.

В любом случае, я хотел бы знать, возможно ли это. Так, например:

class Example
  def say_hello
    "Hello"
  end

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

Без изменения вышеизложенного, Sinatra скажет, что нет метода say_hello для объекта SinatraApplication.

Ответ 1

Вам просто нужно наследовать от Sinatra::Base:

require "sinatra/base"

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

  get "/hello" do
    say_hello
  end
end

Вы можете запустить приложение с помощью Example.run!.


Если вам нужно больше разделения между частями вашего приложения, просто создайте другое приложение Sinatra. Поместите общие функции в классы моделей и помощники и запустите все свои приложения вместе с 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

Установите Thin и запустите приложение с помощью thin start.