使用rackup时未找到Sinatra静态资产

时间:2011-02-20 05:50:23

标签: ruby configuration sinatra

我有一个简单的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

5 个答案:

答案 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

(基于How to deploy a modular Sinatra app to Heroku?

答案 3 :(得分:2)

为了让我能够通过config.ru推出新的Sinatra应用程序,我必须做其他答案中建议的两件事:

class MyApp < Sinatra::Base
  set :static, true
  set :root, File.dirname(__FILE__)
end

答案 4 :(得分:2)

首先在sinatra项目中创建一个名为“public”的文件夹,然后添加几个文件夹

  • 样式表
  • Javascript角
  • 图像

将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应用程序中注册的任何网址,问题解决了!