2012-05-14 12 views
10

मैं एक पुस्तकालय लिख रहा हूं जिसमें थोर के माध्यम से एक एम्बेडेड सिनात्रा ऐप लॉन्च किया गया है। मैं Sprockets::Environment/css और /js पर उदाहरणों को माउंट करना चाहता हूं और मुख्य ऐप / पर मैप किया गया है। यह का उपयोग config.ru फ़ाइल में आसान होगा, लेकिन इस मामले में ऐसा कोई नहीं है क्योंकि मैं Sinatra::Application.run! के साथ प्रोग्रामैटिक रूप से सिनात्रा ऐप शुरू कर रहा हूं। इसे कैसे प्राप्त किया जा सकता है?मैं रैंकअप फ़ाइल के बिना सिनात्रा के साथ स्प्राकेट्स का उपयोग कैसे करूं?

उत्तर

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

यहाँ कैसे मैं रेल की तरह निर्देशिका लेआउट, सहायकों और जे एस और सीएसएस के लिए minification साथ सिनात्रा में एकीकृत Sprockets है।

मैंने सिनात्रा एक्सटेंशन लिखना चुना। यह एक्सटेंशन स्पॉकेट्स (पथ, न्यूनीकरण, सहायक) की कॉन्फ़िगरेशन को समाहित करता है और एप्लिकेशन द्वारा पंजीकृत किया जा सकता है।

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 का उपयोग कर रहा हूं जो javascript_tag जैसे सहायक प्रदान करता है। उपर्युक्त कॉन्फ़िगरेशन मानता है कि विकास में, आप संदर्भित संपत्ति द्वारा आवश्यक संपत्तियों का विस्तार करना चाहते हैं (जिसके परिणामस्वरूप प्रति संपत्ति एकाधिक टैग)।

संबंधित मुद्दे