2016-06-12 6 views
0

Ich benutze Ritzel mit Sinatra, wie in Sinatras Seite docs vorgeschlagen, aber ich kann es nicht funktionieren.Sinatra Asset-Pipeline, kann es nicht funktionieren

Wenn ich zu localhost:4567 gehe, lädt die Seite korrekt, aber ohne Stile. Wenn ich zu localhost:4567/assets/app.css gehe, erhalte ich einen nicht gefundenen Fehler. Ich frage mich, was ich vermisse oder was falsch ist, wenn ich Kettenräder benutze?

Dies ist meine Ordnerstruktur:

├── 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 

Der Inhalt app.css sind:

//= require normalize 
//= require base 

Der Inhalt app_assets.rb sind:

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 

Der Inhalt lib/main.rb sind:

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

class Main < Sinatra::Base 

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

    get '/' do 
    erb :index 
    end 

end 

Die Datei views/index.erb enthält die Zeile:

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

und der Inhalt von bin/app sind:

#!/usr/bin/env ruby 

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

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

require 'main' 
Main.run! 

Was ich Typisierung laufen:

$ bin/app 

Jede Hilfe wäre Ich bin mir sicher, dass ich etwas falsch gemacht habe aber ich kann nicht sehen was. Kann es jemand finden?

Antwort

2

Die app_assets.rb Datei ist das Problem hier. Wenn Sie diese Datei in einer anderen Datei benötigen, werden die Methoden, die Sie in diesem Modul definieren, nicht automatisch einbezogen. Sie müssen explizit include AppAssets wo immer Sie die self.environment Methode zu existieren benötigen.

Das zweite Problem hier ist, dass self.environment ist nicht äquivalent zu settings.environment. Wenn ich es richtig verstehe, versuche ich, das Asset-Routing zu definieren, wann immer das Modul aufgenommen wird. Um dies zu erreichen, verwenden Sie den Haken included für Module. Dieser Hook wird jedes Mal ausgeführt, wenn Sie ein Modul in einen Kontext einschließen. Wenn Sie diese verwenden, wird der Code in app_assets.rb zu:

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 

Das klass Argument dieser Haken ist die Klasse, in die dieses Modul enthalten ist. In unserem Fall ist dies die Sinatra-Klasse, die Sie in main.rb beschrieben haben. Diese Datei wie folgt aussieht:

class Main < Sinatra::Base 
    include AppAssets 

    # Same as what you have 
end 

Es gibt einen Sinatra Rezepte Artikel über Kettenräder mit Sinatra mit: http://recipes.sinatrarb.com/p/asset_management/sprockets?#article

+0

Thank you! Das hat das Problem gelöst. Ich bin neu in Sinatra und wusste nichts über die eingeschlossene Methode. Ich folgte dem von Ihnen geposteten Link, wollte aber die Assets in einem eigenen Modul haben, damit ich sie in anderen Klassen wiederverwenden konnte. –

Verwandte Themen