Совместное использование ruby кода для Sinatra :: Base & Sinatra :: Классы приложений - PullRequest
1 голос
/ 17 апреля 2020

Я новичок в фреймворке Sinatra и пытаюсь сделать гем совместимым с приложениями на основе Sinatra :: Base & Sinatra :: Application. У меня есть этот код в моем гем, и он отлично работает в обоих приложениях:

health_check.rb

class App1 < Sinatra::Base
  get '/health/liveness' do
    halt 204
  end
end

class App2 < Sinatra::Application
  get '/health/liveness' do
    halt 204
  end
end

Но я повторяю код, и я хотел бы иметь что-то вроде этого, но это не работает:

health_check.rb

module HealthHelper
  get '/health/liveness' do
    halt 204
  end
end

class App1 < Sinatra::Base
  include HealthHelper
end

class App2 < Sinatra::Application
  include HealthHelper
end

Когда я пытаюсь запустить любое приложение с включенным гемом, я получаю эту ошибку

/lib/health_check.rb:3:in `<module:HealthHelper>': undefined method `get' for HealthHelper:Module (NoMethodError)
Did you mean?  gets
               gem

Любая идея сделать его чище?

Ответы [ 2 ]

2 голосов
/ 17 апреля 2020

Вместо простого использования include вы можете написать расширение Sinatra , определяющее маршруты.

Это может выглядеть примерно так:

require 'sinatra/base'

module HealthHelper
  def self.registered(app)
    app.get '/health/liveness' do
      halt 204
    end
  end
end

# This line is so it will work in classic Sinatra apps.
Sinatra.register(HealthHelper)

Тогда в ваших реальных приложениях вы используете register вместо include:

require 'sinatra/base'
require 'health_helper'

class App1 < Sinatra::Base
  register HealthHelper
end

Теперь маршруты будут доступны в App1. Обратите внимание, что вы, вероятно, не хотите расширять Sinatra::Application, а скорее Sinatra::Base.

1 голос
/ 17 апреля 2020

После многих попыток я нашел очень простое решение:

health_check.rb

class Sinatra::Base
  get '/health/liveness' do
    halt 204
  end
end

Sinatra :: Приложение является подклассом Sinatra: Base, поэтому я включил код непосредственно в Синатра: определение базового класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...