我有一个简单的Sinatra应用程序,使用模块化样式进行配置。当我按照自述文件中的建议使用rackup -p 4567
启动应用程序时,不会提供公用文件夹中的静态资源。但是当我使用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
答案 0 :(得分:16)
看起来这个答案有两个好的答案(现有的答案都不适用于我)。
首先,在您的config.ru文件中,您可以包含以下内容:
# Replace the directory names to taste
use Rack::Static, :urls => ['/stylesheets', '/javascripts'], :root => 'public'
或者,如果您通过rackup运行应用,则:static
选项默认设置为false
。您可以通过以下咒语解决此问题:
class MyApp < Sinatra::Base
set :static, true
# ...
end
答案 1 :(得分:3)
我有同样的问题,我这样解决了。 我在我的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'}
答案 2 :(得分:2)
不是肯定的,但您可能需要set :root, Stick.root
?
答案 3 :(得分:2)
为了让我能够通过config.ru推出新的Sinatra应用程序,我必须做其他答案中建议的两件事:
class MyApp < Sinatra::Base
set :static, true
set :root, File.dirname(__FILE__)
end
答案 4 :(得分:2)
首先在sinatra项目中创建一个名为“public”的文件夹,然后添加几个文件夹
将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都可用于Sinatra应用程序中注册的任何网址,问题解决了!