2016-06-12 11 views
0

Sinatraのページドキュメントに示唆されているように、私はSinatraでSprocketsを使用していますが、動作させることはできません。Sinatraの資産パイプラインが機能しない

私がlocalhost:4567に行くと、ページは正しく読み込まれますが、スタイルはありません。 localhost:4567/assets/app.cssに行った場合、私はエラーが見つかりません。私はスプロケットを使用している方法で私が逃しているか、何が間違っているのだろうか?

これは私のフォルダ構造です:app.css

├── assets 
│   ├── css 
│   │   ├── app.css 
│   │   ├── base.css 
│   │   └── normalize.css 
├── bin 
│   └── app 
├── lib 
│   ├── app_assets.rb 
│   └── main.rb 
├── spec 
│   ├── spec_helper.rb 
│   └── main_spec.rb 
├── views 
│   └── index.erb 
├── Gemfile 
├── Gemfile.lock 
├── Rakefile 
├── .rspec 
└── .ruby-version 

内容は以下のとおりです。app_assets.rb

//= require normalize 
//= require base 

内容は以下のとおりです。lib/main.rb

module AppAssets 

    def self.environment root_path 
    environment = Sprockets::Environment.new root_path 
    environment.append_path './assets/css/' 
    environment 

    # get assets 
    get '/assets/*' do 
     env['PATH_INFO'].sub!('/assets', '') 
     settings.environment.call(env) 
    end 
    end 

end 

内容は以下のとおりです。

require 'sinatra' 
require 'sprockets' 
require 'app_assets' 

class Main < Sinatra::Base 

    set :views, "#{settings.root}/../views" 

    get '/' do 
    erb :index 
    end 

end 

ファイルviews/index.erbは行が含まれます

<link rel="stylesheet" href="assets/app.css"> 

をそしてbin/appの内容は以下のとおりです。すべてのヘルプは次のようになり

$ bin/app 

:私はタイピングを実行

#!/usr/bin/env ruby 

$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib') 

require 'sinatra' 
require 'sprockets' 
require 'app_assets' 

require 'main' 
Main.run! 

私は間違ったことをした私は何が見えないのですか?誰でもそれを見つけることができますか?

答えて

2

app_assets.rbファイルが問題です。このファイルが別のファイル内に必要な場合、このモジュール内で定義したメソッドは自動的には含まれません。 self.environmentメソッドが存在する必要がある場合は、明示的にinclude AppAssetsを指定する必要があります。

self.environmentsettings.environmentと等価ではありません。私が正しく理解しているなら、あなたがしようとしているのは、モジュールが含まれるたびに資産ルーティングを定義することです。この方法を実現するには、モジュールにincludedフックを使用します。このフックは、モジュールをコンテキスト内に含めるたびに実行されます。

module AppAssets 
    def self.included(klass) 
    environment = Sprockets::Environment.new klass.settings.root 

    # note the change to path. Since the file where this gets included 
    # is inside a sub-folder, we need to traverse to one level above. 
    environment.append_path '../assets/css/' 
    klass.set :environment, environment 

    klass.get '/assets/*' do 
     env['PATH_INFO'].sub!('/assets', '') 
     klass.settings.environment.call(env) 
    end 
    end 
end 

このフックにklass引数は、このモジュールが含まれているにクラスです:あなたはそれを使用する場合は、app_assets.rbのコードはになります。私たちの場合、これはmain.rbで説明したSinatraクラスです。このファイルには、次のようになります。

class Main < Sinatra::Base 
    include AppAssets 

    # Same as what you have 
end 

シナトラのスプロケットを使用する方法についてシナトラレシピの記事があります:http://recipes.sinatrarb.com/p/asset_management/sprockets?#article

+0

ありがとうございました!その問題を解決しました。私はSinatraを初めて使っていて、含まれている方法について知らなかった。投稿したリンクをフォローしていましたが、他のクラスで再利用できるように、自分のモジュールにアセットを持たせたいと思っていました。 –

関連する問題