2016-06-12 45 views
0

我正在使用Sinatra的鏈輪,正如Sinatra的頁面文檔中所建議的,但我無法使其工作。Sinatra資產管道,無法使其工作

當我轉到localhost:4567時,頁面加載正確,但沒有樣式。如果我去localhost:4567/assets/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.css內容是:

//= require normalize 
//= require base 

app_assets.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 

lib/main.rb內容是:

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內容是:

#!/usr/bin/env ruby 

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

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

require 'main' 
Main.run! 

它在我奔跑打字:

$ bin/app 

任何幫助將是我很肯定,我犯了一些錯誤但我看不到。任何人都可以發現它嗎?

回答

2

app_assets.rb文件是這裏的問題。當你在另一個文件中需要這個文件時,你在這個模塊中定義的方法不會自動包含。只要您需要self.environment方法存在,您需要明確地include AppAssets

這裏的第二個問題是self.environment不等於settings.environment。如果我理解正確,你要做的是在模塊被包含時定義資產路由。要實現這一目標,請使用included鉤子模塊。每次在上下文中包含模塊時,該鉤子都會運行。如果您使用的是,在app_assets.rb代碼變爲:

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參數這個鉤子是在其中包含該模塊的類。在我們的例子中,這是您在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的新手,並不知道所包含的方法。我正在關注您發佈的鏈接,但希望將這些資源放在自己的模塊中,以便我可以在其他類中重用它。 –