2016-06-12 3 views
0

Sinatra의 페이지 문서에 나와있는 것처럼 Sinatra와 함께 스프로킷을 사용하고 있지만 제대로 작동하지 않습니다.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 

에게 어떤 도움이 될 것이다 : I 입력을 실행

#!/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 클래스입니다. http://recipes.sinatrarb.com/p/asset_management/sprockets?#article

+0

감사합니다 :

class Main < Sinatra::Base include AppAssets # Same as what you have end 

이시나와 톱니 사용에 대한시나 조리법 기사가있다 :처럼 그 파일이 보인다! 그 문제를 해결했습니다. 저는 Sinatra를 처음 접했고 포함 된 방법에 대해 알지 못했습니다. 게시 한 링크를 따라했지만 다른 모듈에서 재사용 할 수 있도록 자체 모듈에 자산을 갖고 싶었습니다. –

관련 문제