【问题标题】:Custom :public directory in Sinatra not working自定义:Sinatra 中的公共目录不起作用
【发布时间】:2011-04-02 17:14:55
【问题描述】:

所以,我正在开发一个 sinatra 应用程序,该应用程序为客户托管多个不同的微型站点。我的 public 和 views 目录的结构是这样的:

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

如文档中所述。有什么想法吗?

【问题讨论】:

  • 你的两行之前是否设置了set :root, File.dirname(__FILE__) # _FILE_ - the root folder的根文件夹?

标签: ruby routes sinatra custom-routes


【解决方案1】:

我想这与你设置 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

但是,我不确定 Sinatra 是否旨在以这种方式提供静态文件,并且无论如何可能有更好的解决方案可用。例如,您可以完全在 Nginx 或 Apache 中完成此操作,完全无需让 Sinatra 提供静态文件。

【讨论】:

  • 我想我开始了解公共设置的问题了,即尝试从获取操作中设置将没有用 - sinatra 似乎在公共资产实际获取之前渲染了它到路由处理程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
  • 1970-01-01
  • 2014-11-28
  • 1970-01-01
  • 2019-08-01
  • 2011-02-24
  • 2017-11-30
相关资源
最近更新 更多