如何使用不同范围分割Sinatra应用程序?
问题描述:
我正在使用寄存器将一个大的Sinatra文件分成不同的文件。这是获得modular Sinatra app using extensions的一种方法。如何使用不同范围分割Sinatra应用程序?
我结束了类似下面的代码:
MyApp < Sinatra::Base
register OneRegister
register SecondRegister
end
module OneRegister
def self.registered(app)
app.helpers OneRegisterHelper
app.get "/one-endpoint" do
do_stuff
end
end
module OneRegisterHelper
def do_stuff
# Some code
end
end
end
module SecondRegister
def self.registered(app)
app.helpers SecondRegisterHelper
app.get "/second-endpoint" do
do_stuff
end
end
module SecondRegisterHelper
def do_stuff
# Different code
end
end
end
问题是西纳特拉如何与寄存器和助手。每次我为注册表创建一个新的帮助程序时,我都会使用帮助程序中的方法来污染主要的Sinatra应用程序范围。
因此,方法do_stuff
将被覆盖SecondRegisterHelper
(这是如何包括一个模块的Ruby的工作原理),但我想有不同的实现方法,而不用担心,如果我使用相同的方法名称或不同的名称(每个应用程序使用25个寄存器以小方法映射)。
基本上,我想有不同的寄存器与私有方法,因为我通常写一个单一的责任非常小的私人方法。任何想法,我怎么能做到这一点?
答
我不认为这是可以实现的方式,你正在尝试。如果你在不同的模块中使用类似名称的方法混合成一个类,那么最后一个只会赢。
所以在这种情况下,我会创建一个modular app结合config.ru来设置您的应用程序。
class OneRegister < Sinatra::Base
# helpers here
end
class SecondRegister < Sinatra::Base
# helpers here
end
在config.ru
app = Rack::URLMap.new(
'/one-endpoint' => OneRegister,
'/second-endpoint' => TwoRegister
)
run app
不,你佣工范围限定在一个单独的类。