Статические активы Sinatra не обнаруживаются при использовании Rackup
У меня есть простое приложение Sinatra, которое настроено с использованием модульного стиля. Когда я запускаю приложение, используя rackup -p 4567
как рекомендуется в файле readme, статические ресурсы в общей папке не обслуживаются. Но когда я начинаю это использовать shotgun ./config.ru -p 4567
тогда они подаются. Почему это происходит? Может ли это произойти в производстве?
Вот мой код:
# config.ru
require 'rubygems'
require 'bundler'
require 'sinatra'
require 'jammit'
Bundler.require
Jammit.package!
require File.expand_path('./stick.rb')
run Stick
и это файл приложения ruby
require 'sinatra/base'
class Stick < Sinatra::Base
get '/' do
haml :index
end
end
5 ответов
Похоже, есть два хороших ответа на этот (ни один из существующих не работал для меня).
Прежде всего, в вашем файле config.ru вы можете включить следующее:
# Replace the directory names to taste
use Rack::Static, :urls => ['/stylesheets', '/javascripts'], :root => 'public'
В качестве альтернативы, если вы запускаете приложение через стойку, :static
опция установлена в false
по умолчанию. Вы можете исправить это следующим заклинанием:
class MyApp < Sinatra::Base
set :static, true
# ...
end
У меня была такая же проблема, и я решил так. Я добавил эту строку в моем config.ru .
map "/public" do
run Rack::Directory.new("./public")
end
И я использую статические файлы в моих представлениях, как это
%link{:type => 'text/css', :rel => 'stylesheet', :href => '/public/css/reset.css'}
%link{:type => 'text/css', :rel => 'stylesheet', :href => '/public/css/text.css'}
%link{:type => 'text/css', :rel => 'stylesheet', :href => '/public/css/960.css'}
%link{:type => 'text/css', :rel => 'stylesheet', :href => '/public/css/app.css'}
Чтобы я мог работать над новым приложением Sinatra, запущенным через config.ru, мне пришлось сделать две вещи, предложенные в других ответах:
class MyApp < Sinatra::Base
set :static, true
set :root, File.dirname(__FILE__)
end
Не позитивно, но вам может понадобиться set :root, Stick.root
?
(Основано на том, как развернуть модульное приложение Sinatra в Heroku?)
Сначала создайте папку с именем public в вашем проекте sinatra, затем добавьте пару папок
- таблицы стилей
- JavaScripts
- изображений
Добавьте свой CSS, JS и / или JPG,PNG (изображения) в каждую папку
Наконец, как говорит @sirfilip, добавьте строки ниже в файл config.ru
map "/public" do
run Rack::Directory.new("./public")
end
Если универсальный Sinatra (без рамок по умолчанию)
просмотров /layout.erb
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
...
<link rel="stylesheet" href="stylesheets/your_file.css">
<link rel="icon" type="image/ico" href="images/your_image.ico" />
</head>
<body>
<%= yield %>
...
<script src="javascripts/your_js.js"></script>
просмотров /index.erb
<div class="margin-bottom-30">
<div class="row">
<div class="col-md-12">
<ul class="nav nav-pills">
<li class="active"><a href="#">Home <span class="badge">42</span></a></li>
<li>...</li>
</ul>
</div>
</div>
</div>
Все ваши изображения, таблицы стилей и javascripts будут доступны для любого URL, зарегистрированного в вашем приложении Sinatra, проблема решена!