使用路线中的选项编写Sinatra扩展

时间:2010-10-06 22:57:09

标签: ruby sinatra

让我们说我正在编写一个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,我希望如此。有什么想法吗?

2 个答案:

答案 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

显然,那里还有很多事情需要做,但是你得到了漂移。