使用rackup时未找到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 

看起来这个有两个很好的答案(现有的都不适合我)。

首先,在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 

我有同样的问题,我这样解决了。 我在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'} 

不是积极的,但你可能需要set :root, Stick.root

(基于如何将模块化Sinatra应用程序部署到Heroku? )

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

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

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

  • 样式表
  • JavaScript的
  • 图片

将CSS,JS和/或JPG,PNG(图像)添加到每个文件夹

最后,@ sirfilip说下面的行添加到config.ru文件

 map "/public" do run Rack::Directory.new("./public") end 

如果是通用的Sinatra(没有框架默认)

意见/ layout.erb

    ...     <%= yield %> ...  

意见/ index.erb

  

所有图片,样式表和javascripts都可用于Sinatra应用程序中注册的任何URL,问题解决了!