Module: Snails::Assets

Defined in:
lib/snails/app.rb

Overview

Then, in your view:

<script src=“/assets/js/app.js”></script> <link rel=“stylesheet” href=“/assets/css/styles.css” />

Defined Under Namespace

Modules: Tasks

Class Method Summary collapse

Class Method Details

.registered(app) ⇒ Object



97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/snails/app.rb', line 97

def self.registered(app)
  require 'sprockets-helpers'

  cwd = Pathname.new(Dir.pwd)
  app.set :sprockets, Sprockets::Environment.new(cwd)
  app.set :digest_assets, false
  app.set :assets_prefix, app.setting(:assets_prefix, '/assets') # URL
  app.set :assets_paths, app.setting(:assets_paths, %w(assets)) # source files
  app.set :assets_public_path, app.setting(:assets_public_path, cwd.join('public', 'assets')) # output dir
  app.set :assets_precompile, app.setting(:assets_precompile, %w(js/main.js css/main.css))
  app.set :assets_remove_digests, app.setting(:assets_remove_digests, false)

  app.configure do
    app.assets_paths.each do |path|
      app.sprockets.append_path cwd.join(path)
    end
  end

  app.configure :production, :staging do
    # app.sprockets.css_compressor = :sass
    # app.sprockets.js_compressor = :uglifier
  end

  app.configure :development, :test do
    # allow asset requests to pass
    if app.respond_to?(:allow_paths)
      app.allow_paths.push /^#{app.assets_prefix}(\/\w+)?\/([\w\.-]+)/
    end

    # and serve them
    app.get "#{app.assets_prefix}/*" do |path|
      env_sprockets = request.env.dup
      env_sprockets['PATH_INFO'] = path
      app.sprockets.call(env_sprockets)
    end
  end

  app.helpers do
    def asset_path(filename)
      file = manifest[filename] or raise "Not found in manifest: #{filename}"
      [settings.assets_prefix, file].join('/')
    end

    if Snails.env.production?
      def manifest
        @manifest ||= read_manifest
      end
    else
      def manifest
        read_manifest
      end
    end

    def read_manifest
      file = Dir[settings.assets_public_path + '/.*.json'].first or raise "No manifest found at #{path}"
      JSON.parse(IO.read(file))['assets']
    end
  end
end