让我们说我正在编写一个sinatra扩展,它在给定的挂载点安装第二个public
目录。
require 'sinatra'
require 'sinatra/moar-public'
set :moar_local, './downloads/'
set :moar_remote, 'dls'
我现在希望用户http://myapp.com/downloads/thing.bin
可以[sinatra_root]/dls/thing.bin
获得该文件。
编写这个扩展名(显然,这是一个简化的例子)我有这样的东西:
require 'sinatra/base'
module Sinatra
module MoarPublic
def self.registered(app)
app.set :moar_local, './downloads/'
app.set :moar_remote, 'downloads'
app.get "/#{app.options.moar_remote}/:filename" do
# Logic
end
end
end
register MoarPublic
end
但app.get
已使用moar_remote
的默认值进行调用,因此下载文件位于/downloads/thing.bin
,而不是/dls/thing.bin
,我希望如此。有什么想法吗?
答案 0 :(得分:0)
我在模块化配置中明确注册扩展名没有问题。下图。
class Service < Sinatra::Base
set :url_prefix, 'foo'
register Common
end
module Common
def self.registered(app)
app.get "/#{app.options.url_prefix}/bar" do
"hello world"
end
end
end
答案 1 :(得分:0)
你要求动态路线,但Sinatra会编制路线信息,因此它不会像你想要的那样工作。
作为一种解决方法,您可以考虑定义一个包罗万象的路线,并检查全部内容中的路线信息,例如
get %r{^/(*)/bar$} do |capture|
if settings.url_prefix == capture # or perhaps check against request.path_info
# get file
else
status 404
end
end
显然,那里还有很多事情需要做,但是你得到了漂移。