Я пишу библиотеку, которая имеет встроенное приложение Sinatra, запущенное через Thor. Я хочу установить экземпляры Sprockets::Environment
на /css
и /js
и иметь основное приложение, сопоставленное с /
. Это было бы легко использовать Rack::URLMap
в файле config.ru
, но в этом случае нет ни одного, потому что я запускаю приложение Sinatra программно с Sinatra::Application.run!
. Как я могу это достичь?Как использовать звездочки с Sinatra без файла для загрузки?
ответ
Я закончил это, написав специальное промежуточное программное обеспечение с некоторыми функциями от 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!
Собственно, это не так сложно. Все, что вам нужно сделать, это назначить экземпляр 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
Happy sprocketing!
Вот как я интегрирована Звездочка в Синатры с 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, который предоставляет помощники, такие как javascript_tag
. В приведенной выше конфигурации предполагается, что в процессе разработки вы хотите расширить активы, требуемые ссылочным активом (в результате получается несколько тегов для каждого актива).
Спасибо за это - именно то, что я искал. – theTRON
Всегда рад помочь! –
Это, как и все примеры синатра-звездочек, которые я видел, не работает (или больше не работает). Что-то в звездочках изменилось? – Ian