在Sinatra中使用多个公共目录

时间:2013-05-01 09:50:06

标签: sinatra assets public

我的sinatra应用程序包含在宝石中。这意味着资产(css / js)存在于gem中。该应用程序动态写入生成的图像并为其提供服务;目前正在向公众目录写信和服务。

我更喜欢不在gem目录中编写生成的图像,而是在实现此gem的web应用程序下编写某些类型的“缓存”目录。

Gem安装在/var/www/TE/shared/gems/ruby/1.8/gems/tubemp-0.6.0,因此资产位于{ /var/www/TE/shared/gems/ruby/1.8/gems/tubemp-0.6.0/lib/public/css/

Gem部署在/var/www/TE/current/的简单机架应用中,因此我更愿意编写并提供/var/www/TE/current/public的缩略图。

但是,自定义public-dir的设置只允许设置一个目录:

set :public_folder, File.join(Dir.pwd, "public")

打破资产服务; Dir.pwd是Rack应用程序的目录。公众现在是Rack-app下的目录,但这不是资产所在的地方:他们生活在宝石的“公共”之下。

set :public_folder, File.join(gemdir, "public")

中断生成的缩略图的服务。

我可以重写应用程序,因此它通过Sinatra服务资产或缩略图,但这似乎是一些开销。

这是唯一的方法吗?或者有没有办法让Sinatra有两个或更多公共目的地来自serve its static items

1 个答案:

答案 0 :(得分:3)

我认为可能有一些选项,但是这里有一个小应用程序来从两个地方提供静态文件,扩展名和主应用程序的公共文件夹:

目录布局

root/
  app.rb
  public/images/foo.jpg
  lib/sinatra/
       gemapp.rb
       gemapp/public/images/bar.jpg

扩展名

# lib/sinatra/gemapp.rb
module Sinatra
  module GemApp
    def self.registered(app)

      app.set :gem_images, File.expand_path( "gemapp/public/images", File.dirname(__FILE__))

      app.get "/images/:file" do |file|
        send_file File.join( settings.gem_images, file)
      end

      app.get "/gemapp" do
        "running"
      end
    end
  end
  register GemApp
end

主要应用

require 'sinatra'

require_relative "./lib/sinatra/gemapp.rb"

get "/" do
  "home"
end

它为我提供的文件很好。