首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为Sinatra::Base & Sinatra::Application类共享ruby代码

为Sinatra::Base & Sinatra::Application类共享ruby代码
EN

Stack Overflow用户
提问于 2020-04-18 01:24:38
回答 2查看 95关注 0票数 1

我是Sinatra框架的新手,我正在尝试做一个与Sinatra::Base & Sinatra::Application based apps兼容的gem。我的gem中有这个代码,它在两个应用程序中都工作得很好:

health_check.rb

代码语言:javascript
复制
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

代码语言:javascript
复制
module HealthHelper
  get '/health/liveness' do
    halt 204
  end
end

class App1 < Sinatra::Base
  include HealthHelper
end

class App2 < Sinatra::Application
  include HealthHelper
end

当我尝试初始化任何包含gem的应用程序时,我得到了这个错误

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

有没有办法让它变得更干净?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-18 03:52:36

您可以编写一个定义路由的Sinatra extension,而不是简单地使用include

它可能看起来像这样:

代码语言:javascript
复制
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

代码语言:javascript
复制
require 'sinatra/base'
require 'health_helper'

class App1 < Sinatra::Base
  register HealthHelper
end

现在,路由将在App1中可用。请注意,您可能不希望扩展Sinatra::Application,而希望扩展Sinatra::Base

票数 2
EN

Stack Overflow用户

发布于 2020-04-18 04:04:52

经过多次尝试,我得到了一个非常简单的解决方案:

health_check.rb

代码语言:javascript
复制
class Sinatra::Base
  get '/health/liveness' do
    halt 204
  end
end

Sinatra::Application是Sinatra:Base的子类,所以我直接将代码包含在Sinatra:Base类定义中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61277245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档