2011-04-02 26 views
1

所以,我有一个sinatra应用程序,我正在与应用程序托管几个不同的微型客户端的应用程序。我有我的公开和看法目录结构的方式是像这样:自定义:Sinatra公共目录不工作

sites/ 
    site1/ 
    public/ 
     style.css 
    views/ 
     layout.haml 
     general.haml 
    site2/ 
    public/ 
     style.css 
    views/ 
     layout.haml 
     general.haml 

现在,当请求到来时我有以下两行:

set :views, Proc.new { File.join(root, "sites/#{site}/views") } 
set :public, Proc.new { File.join(root, "sites/#{site}/public") } 

当传入请求进入,并且网站被定义为“site1”,那么这些视图就会根据需要正常工作,并将它们呈现在适当的文件夹之外。但是,调用“/style.css”路由将返回404错误。

当我在应用程序根目录中创建公共目录并将style.css放置在那里时,它可以正常工作。不过,我需要这种方式逐个工作。我要去从官方文档by Sinatra的,但它仍然是行不通的,即使我设置

enable :static 

,或者如果我使用

set :static, true 

如文档描述。有任何想法吗?

+0

你是否在两行之前用'set:root,File.dirname(__ FILE__)#_FILE_ - 根文件夹'设置了根文件夹? – 2011-04-02 09:11:26

回答

0

我想这与你如何设置site有关。如果我正确理解你所要求的内容,我相信你会想在你的应用程序中创建一个方法而不是一个静态设置site。这个例子这样做,并预期为我工作:

class Test < Sinatra::Base 
    set :public, Proc.new { File.join(site, "public") } 
    set :static, true 

    register do 
    def site 
     ["x", "y", "z"][rand * 3] 
    end 
    end 

    get "/" do 
    settings.public 
    end 
end 

但是,我不知道西纳特拉被设计为静态文件这种方式,并有可能提供更好的解决方案呢。例如,您可能完全可以在Nginx或Apache中执行此操作,而不需要让Sinatra完全服务于静态文件。

+0

我想我已经开始理解公共设置是怎么回事了,即试图从获取动作中进行设置并不会带来好处 - 在实际到达路由处理器之前,sinatra似乎会渲染公共资产。 – zorz 2011-04-03 00:57:14