Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use multiple public directories in Sinatra

My sinatra application is contained in a gem. This means that the assets (css/js) live in the gem. This application writes on the fly generated images and serves them; currently writing into and serving from the public dir.

I prefer to not write the generated images in the gem dir but to a "cache" dir of some sorts under the web-application implementing this gem.

Gem is installed at /var/www/TE/shared/gems/ruby/1.8/gems/tubemp-0.6.0, so assets are at e.g. /var/www/TE/shared/gems/ruby/1.8/gems/tubemp-0.6.0/lib/public/css/.

Gem is deployed in a simple rack-app at /var/www/TE/current/, so I would prefer to write and serve the thumbnails from /var/www/TE/current/public.

However, the setting for a custom public-dir allows only one dir to be set:

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

Breaks the serving of assets; Dir.pwd being the directory of the Rack app. Public is now the dir under the Rack-app, but that is not where the assets are found: they live under the "public" in the gem.

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

Breaks serving of the generated thumbnails.

I could rewrite the application so it serves either the assets or the thumbnails trough Sinatra, but that seems quite some overhead.

Is that the only way? Or is there a way to give Sinatra two or more public dirs to serve its static items from?

like image 294
berkes Avatar asked May 01 '13 09:05

berkes


1 Answers

I think there's probably a few options, but here's how I got a little app to serve static files from two places, an extension and the main app's public folder:

Directory layout

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

The extension 

# 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

The main app

require 'sinatra'

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

get "/" do
  "home"
end

It served files fine for me.

like image 179
ian Avatar answered Sep 20 '22 19:09

ian