私はThor経由で起動したSinatraアプリが埋め込まれたライブラリを作成しています。 Sprockets::Environment
のインスタンスを/css
と/js
にマウントし、メインアプリを/
にマッピングしたいとします。これはをconfig.ru
ファイルに入れても簡単ですが、Sinatra::Application.run!
でSinatraアプリケーションをプログラムで開始しているため、この場合は1つもありません。どうすればこれを達成できますか?ラックアップファイルなしでSinatraでスプロケットを使用するにはどうすればよいですか?
10
A
答えて
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!
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を使用しています。上記の構成では、開発時に、参照資産が必要とする資産を拡張して資産ごとに複数のタグを作成することを前提としています。
関連する問題
- 1. rspecを使用してsinatraでリダイレクトをテストするにはどうすればよいですか?
- 2. sinatraでハッシュデータにアクセスするにはどうすればよいですか?
- 3. シンボルを使用してSinatraのパラメータにアクセスするにはどうすればよいですか?
- 4. モデル内でSinatraヘルパーを使用するにはどうすればよいですか?
- 5. sinatra streaming apiを使用してredis接続を閉じるにはどうすればよいですか?
- 6. Sinatraのフォームフィールドにはどのようにアクセスすればよいですか?
- 7. ラックまたはSinatraアプリのメモリ使用量を測定するにはどうすればよいですか?
- 8. SinatraプロジェクトでTwitter BootstrapとSassを使用するにはどうすればいいですか?
- 9. node.jsでモジュールを使用しないようにするにはどうすればよいですか?
- 10. モジュールでインスタンス変数を使用しないようにするにはどうすればよいですか?
- 11. CrystalReportViewerでフラッシュを使用しないようにするにはどうすればよいですか?
- 12. SQLビューでgetdate()を使用しないようにするにはどうすればよいですか?
- 13. コードベースでkeystore/trustoreプレーンテキストパスワードを使用しないようにするにはどうすればよいですか?
- 14. SL4アプリケーションでSL5ランタイムを使用しないようにするにはどうすればよいですか?
- 15. IIS 7で偽装を使用しないようにするにはどうすればよいですか?
- 16. スプロケットがscssファイルをロードする順序を調整するにはどうすればよいですか?
- 17. requirejsを使用しないでreduxを使用するにはどうすればよいですか?
- 18. JackRabbitでSimpleSecurityManagerが使用されないようにするにはどうすればよいですか?
- 19. タイプをマップキーとして使用しないようにするにはどうすればよいですか?
- 20. SinatraでActionView :: Helpers :: NumberHelperをどのように使用するのですか?
- 21. PDFレンダリング時にCATiledLayerを使用しないようにするにはどうすればよいですか?
- 22. sinatraでテストするためのモックデータベースを設定するにはどうすればよいですか?
- 23. FirebaseUIを専用サインインページなしでリダイレクトモードで使用するにはどうすればよいですか?
- 24. Sinatraでschema.rbの代わりにstructure.sqlを使用するように設定するにはどうすればよいですか?
- 25. Bosunでwin.disk.durationを使用するにはどうすればよいですか、またはカウンタタイプメトリックをダウンサンプルするにはどうすればよいですか?
- 26. 最新のSDK APIを使用しないようにするにはどうすればよいですか?
- 27. アンドロイドでplistを使用するにはどうすればよいですか?
- 28. セキュリティプロバイダをJavaで使用するにはどうすればよいですか?
- 29. ハイパーリンクでカスタムフィールドを使用するにはどうすればよいですか?
- 30. GridViewでgetSelectedView()を使用するにはどうすればよいですか?
ありがとうございます - 私が探していたものです。 – theTRON
いつもお世話になりました! –
これは、私が見たsinatra-sprocketsの例のように、動作しません(または動作しなくなりました)。スプロケットに何か変わった? – Ian