6

私のsinatraアプリケーションはgemに含まれています。これは、アセット (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 の設定では、設定できるディレクトリは 1 つだけです。

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

資産の提供を中断します。Dir.pwd は Rack アプリのディレクトリです。Public は Rack-app の下のディレクトリになりましたが、アセットが見つかる場所ではありません。gem の「public」の下に存在します。

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

生成されたサムネイルの配信を中断します。

Sinatra を介してアセットまたはサムネイルのいずれかを提供するようにアプリケーションを書き直すこともできますが、それはかなりのオーバーヘッドのようです。

それが唯一の方法ですか?または、Sinatra に 2 つ以上のパブリック ディレクトリを与えて静的アイテムを提供する方法はありますか?

4

1 に答える 1

3

おそらくいくつかのオプションがあると思いますが、拡張機能とメイン アプリのパブリック フォルダーの 2 つの場所から静的ファイルを提供する小さなアプリを作成する方法を次に示します。

ディレクトリのレイアウト

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

それは私にとっては問題なくファイルを提供しました。

于 2013-05-01T14:05:38.137 に答える