我正在使用寄存器将大型Sinatra文件拆分为不同的文件。这是获得modular Sinatra app using extensions的一种方法。
我最终得到的代码如下:
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如何使用寄存器和助手。每次我为一个寄存器创建一个新的帮助器时,我都会使用帮助器中的方法来污染主要的Sinatra应用程序范围。
因此,方法do_stuff
将被SecondRegisterHelper
覆盖(这是Ruby在包含模块时的工作方式)但是我希望对这些方法有不同的实现,而不用担心我使用相同的方法名称或不同的方法名称(图像应用程序包含25个寄存器,每个寄存器使用小方法)。
基本上,我希望使用私有方法使用不同的寄存器,因为我通常只编写一个非常小的私有方法。任何想法,我怎么能做到这一点?
答案 0 :(得分:1)
我不认为这可以通过你的尝试来实现。如果你将不同模块中具有相似名称的方法混合到一个类中,那么最后一个只会获胜。
因此,在这种情况下,我会创建一个modular app与config.ru相结合来设置您的应用程序。
app = Rack::URLMap.new(
'/one-endpoint' => OneRegister,
'/second-endpoint' => TwoRegister
)
run app
在config.ru中
<modules>
没有帮助者的范围是一个类。