Estoy escribiendo una biblioteca que tiene una aplicación Sinatra incorporada lanzada a través de Thor. Quiero montar instancias de Sprockets::Environment
en /css
y /js
y hacer corresponder la aplicación principal con /
. Esto sería fácil usando Rack::URLMap
en un archivo config.ru
, pero en este caso no hay ninguno porque estoy iniciando la aplicación Sinatra programáticamente con Sinatra::Application.run!
. ¿Cómo puedo conseguir esto?¿Cómo uso los piñones con Sinatra sin un archivo de rackup?
Respuesta
Terminé haciéndolo escribiendo un middleware personalizado con algunas de las funcionalidades de Rack::URLMap
. Se ve más o menos así:
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!
En realidad, esto no es tan difícil. Todo lo que necesita hacer es asignar una instancia de Sprockets::Environment
a una variable de configuración Sinatra y definir algunos caminos para buscar los activos que le interesan
Aquí hay un ejemplo básico:.
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 feliz!
Aquí es cómo integré en Piñones Sinatra con la disposición de los carriles-como directorio, ayudantes y minimización de JS y CSS.
Elegí escribir una extensión de Sinatra. Esta extensión encapsula la configuración de los piñones (rutas, minificación, ayudantes) y la aplicación puede registrarla.
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
El uso de la extensión de su aplicación es sencilla:
class App < Sinatra::Base
register Sinatra::Assets
# ...
end
Los activos pueden ser colocados en assets
, o vendor/assets
. Por ejemplo, vendor/assets/jquery.js
se puede hacer referencia por nombre lógico, es decir, http://localhost/assets/jquery.js
.
En el ejemplo anterior estoy usando sprockets-helpers que proporciona ayudantes como javascript_tag
. La configuración dada anteriormente asume que en desarrollo, desea expandir los activos requeridos por el activo referenciado (lo que da como resultado varias etiquetas por activo).
- 1. ¿Cómo borrar la caché de los piñones?
- 2. Piñones Archivo no encontrado Excepción
- 3. Uso de FileStream sin un archivo real
- 4. ¿Cómo uso .html.erb como una extensión de archivo para mis vistas con Sinatra?
- 5. Uso de la compresión gzip en Sinatra con Ruby
- 6. ¿Cómo uso Sinatra para servir documentos XML?
- 7. ¿Cómo vincular un archivo Sass en una aplicación Sinatra?
- 8. Piñones require_directory problema
- 9. piñones - ¿puntos de entrada múltiples?
- 10. Cómo utilizar coffeescript con Sinatra
- 11. ¿Cómo usar params con barras diagonales con Sinatra?
- 12. Idear con Sinatra
- 13. Rack :: Session :: Grupo con Sinatra
- 14. ¿Cómo uso un archivo jaxb.index?
- 15. Uso de Proguard con Android sin ofuscación
- 16. Piñones :: CircularDependencyError in Store # índice
- 17. ¿Hay algún problema con el uso de Sinatra para desarrollar un sitio web completo?
- 18. ¿Cómo puedo controlar el almacenamiento en caché de los activos estáticos cuando uso Sinatra?
- 19. ¿Cómo usar SED sin un archivo con un env var?
- 20. ¿Cómo hago formularios html con sinatra?
- 21. Uso de Ajax con caché sin conexión
- 22. Carga de archivos con Sinatra
- 23. Respuesta de transmisión de Sinatra con encabezados
- 24. ¿Puedo habilitar SSL en Sinatra con Thin?
- 25. Erb con Sinatra en rubí
- 26. Cómo servir imágenes generadas con sinatra en ruby
- 27. ¿Cuáles son las diferencias entre usar `rails server` y` rackup`?
- 28. Error de codificación de los piñones en el archivo js: secuencia de bytes UTF-8 no válida
- 29. WCF Configuración sin un archivo de configuración
- 30. ¿Cómo puedo enviar datos binarios de Sinatra?
Gracias por esto, exactamente lo que estaba buscando. – theTRON
¡Siempre dispuesto a ayudar! –
Esto, como todos los ejemplos de sinatra-piñones que he visto, no funciona (o ya no funciona). ¿Ha cambiado algo en los piñones? – Ian