Пользовательский: публичный каталог в Синатре не работает - PullRequest
1 голос
/ 02 апреля 2011

Итак, у меня есть приложение 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, он работает нормально.Тем не менее, мне нужно, чтобы это работало на индивидуальной основе.Я выхожу из официальных документов от Синатры , но все равно не работает, даже если я установил

enable :static

или если я использую

set :static, true

Как описано в документах.Есть идеи?

1 Ответ

0 голосов
/ 02 апреля 2011

Я думаю, это связано с тем, как вы устанавливаете 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 статическими файлами.

...