2012-05-14 4 views
10

私はThor経由で起動したSinatraアプリが埋め込まれたライブラリを作成しています。 Sprockets::Environmentのインスタンスを/css/jsにマウントし、メインアプリを/にマッピングしたいとします。これはをconfig.ruファイルに入れても簡単ですが、Sinatra::Application.run!でSinatraアプリケーションをプログラムで開始しているため、この場合は1つもありません。どうすればこれを達成できますか?ラックアップファイルなしでSinatraでスプロケットを使用するにはどうすればよいですか?

答えて

5

私は、Rack::URLMapの機能のいくつかを備えたカスタムミドルウェアを書くことでそれをやりました。これは、おおよそ次のようになります。ここでは

require "sprockets" 
require "sinatra/base" 

class SprocketsMiddleware 
    attr_reader :app, :prefix, :sprockets 

    def initialize(app, prefix) 
    @app = app 
    @prefix = prefix 
    @sprockets = Sprockets::Environment.new 

    yield sprockets if block_given? 
    end 

    def call(env) 
    path_info = env["PATH_INFO"] 
    if path_info =~ prefix 
     env["PATH_INFO"].sub!(prefix, "") 
     sprockets.call(env) 
    else 
     app.call(env) 
    end 
    ensure 
    env["PATH_INFO"] = path_info 
    end 
end 

class App < Sinatra::Base 
    use SprocketsMiddleware, %r{/assets} do |env| 
    env.append_path "assets/css" 
    env.append_path "assets/js" 
    end 
end 

App.run! 
13

実際、これはそれほど難しいことではありません。あなたがやらなければならないことは、シナトラの設定変数にSprockets::Environmentのインスタンスを割り当て、あなたが興味を持っている資産をルックアップするためにいくつかのパスを定義している

ここでは基本的な例を示します。

require "sass" 
require "haml" 
require "erubis" 
require "sinatra" 
require "sprockets" 

set :assets, Sprockets::Environment.new 

# Configure sprockets 
settings.assets.append_path "app/javascripts" 
settings.assets.append_path "app/stylesheets" 

# For compressed JS and CSS output 
require "yui/compressor" 
settings.assets.js_compressor = YUI::JavaScriptCompressor.new 
settings.assets.css_compressor = YUI::CssCompressor.new 

get "/" do 
    haml :index 
end 

get "/javascripts/:file.js" do 
    content_type "application/javascript" 
    settings.assets["#{params[:file]}.js"] 
end 

get "/stylesheets/:file.css" do 
    content_type "text/css" 
    settings.assets["#{params[:file]}.css"] 
end 

ハッピーsprocketing!

+0

ありがとうございます - 私が探していたものです。 – theTRON

+0

いつもお世話になりました! –

+0

これは、私が見たsinatra-sprocketsの例のように、動作しません(または動作しなくなりました)。スプロケットに何か変わった? – Ian

2

は、私はRailsのようなディレクトリのレイアウト、ヘルパーとJSとCSSの縮小とシナトラにスプロケットを統合する方法です。

私はSinatra拡張を書きました。この拡張は、スプロケット(経路、縮小、ヘルパー)の構成をカプセル化し、アプリケーションによって登録することができます。アプリケーション内の拡張機能を使用して

module Sinatra 
    module Assets 
    extend Sinatra::Extension 

    configure do 
     set :assets, Sprockets::Environment.new(root).tap { |assets| 
     %w(assets vendor/assets).each do |base| 
      %w(images javascripts stylesheets).each do |type| 
      assets.append_path File.join(base, type) 
      end 
     end 
     if production? 
      assets.js_compressor = Closure::Compiler.new 
      assets.css_compressor = YUI::CssCompressor.new 
      uid = Digest::MD5.hexdigest(File.dirname(__FILE__))[0,8] 
      assets.cache = Sprockets::Cache::FileStore.new("/tmp/sinatra-#{uid}") 
     else 
      assets.cache = nil 
     end 
     } 
    end 

    get "/assets/*" do 
     env["PATH_INFO"].sub!(%r{^/assets}, "") 
     expires Time.now + (365*24*60*60) if settings.production? 
     settings.assets.call(env) 
    end 

    helpers do 
     include Sprockets::Helpers 

     Sprockets::Helpers.configure do |config| 
     config.expand = development? 
     config.digest = production? 
     end 

     def assets_environment 
     settings.assets 
     end 
    end 
    end 
end 

は単純です:

class App < Sinatra::Base 
    register Sinatra::Assets 
    # ... 
end 

資産はassets、またはvendor/assetsに配置することができます。たとえば、vendor/assets/jquery.jsは論理名、つまりhttp://localhost/assets/jquery.jsで参照できます。

上記の例では、私はのようなヘルパーを提供するsprockets-helpersを使用しています。上記の構成では、開発時に、参照資産が必要とする資産を拡張して資産ごとに複数のタグを作成することを前提としています。

関連する問題