0

I'm using Rails 4.2, Ruby 2.2

I generated a new app using: rails new app --skip-sprockets

All my Gulp Tasks are successfully running (a lot of them: from gulp-changed and gulp-livereload to gulp-minify-css, gulp-uncss and others).

Using gulp-rev-all I'm able to generate all the assets with the MD5 Fingerprint naming convention.

They are properly saved to rev-manifest.json

app/assets/rev-manifest.json:

{
  "rev-manifest.json": "rev-manifest.9680cee8.json",
  "images/measurement.png": "images/measurement.cedb4145.png",
  "images/measurement2.png": "images/measurement2.cedb4145.png",
  "scripts/chachin.js": "scripts/chachin.5f30b461.js",
  "stylesheets/chachin.scss": "stylesheets/chachin.4c7c499d.scss"
}

app/helpers/application_helper.rb

module ApplicationHelper

  def stylesheet_link_tag(url, options={})
    url = AssetManifest.stylesheet_path(url)

    super(url, options)
  end

  def crossorigin_javascript_include_tag(url, options={})
    url = AssetManifest.javascript_path(url)

    super(url, options)
  end

  def image_tag(url, options={})
    url = AssetManifest.asset_path(url)

    super(url, options)
  end

  def image_path(url, options={})
    url = AssetManifest.asset_path(url)

    super(url, options)
  end

  def image_url(url, options={})
    url = AssetManifest.asset_path(url)

    super((ActionController::Base.asset_host || "") + url, options)
  end

end

config/initializers/asset_manifest.rb

class AssetManifest

  def self.manifest
    if File.exists?("app/assets/rev-manifest.json")
      @manifest ||= JSON.parse(File.read("app/assets/rev-manifest.json"))
    end
  end

  def self.stylesheet_path(url)
    if AssetManifest.manifest
      url += ".css" unless url.end_with?(".css")
      AssetManifest.manifest[url] || url
    else
      url
    end
  end

  def self.javascript_path(url)
    if AssetManifest.manifest
      url += ".js" unless url.end_with?(".js")
      AssetManifest.manifest[url] || url
    else
      url
    end
  end

  def self.asset_path(url)
    if AssetManifest.manifest
      AssetManifest.manifest[url] || url
    else
      url
    end
  end
end

Am I missing something?

defsprite
  • 615
  • 5
  • 7
Jonathan Soifer
  • 2,715
  • 6
  • 27
  • 50

1 Answers1

1

It is probably a good idea to incorporate Rails.root into the path to the asset manifest file.

Here is what I did:

config/initializers/asset_manifest.rb

class AssetManifest

  MANIFEST_FILE = "rev-manifest.json"

  class << self

    def manifest
      @manifest ||= read_manifest(manifest_file_path)
    end

    def stylesheet_path(url)
      url += ".css" unless url.end_with?(".css")
      AssetManifest.manifest[url] || url
    end

    def javascript_path(url)
      url += ".js" unless url.end_with?(".js")
      AssetManifest.manifest[url] || url
    end

    def asset_path(url)
      AssetManifest.manifest[url] || url
    end

    private

    def manifest_file_path
      File.join(Rails.root, "app", "assets", MANIFEST_FILE)
    end

    def read_manifest(path)
      if File.exists?(path)
        JSON.parse(File.read(manifest_file_path))
      else
        {}
      end
    end

  end
end

Hat tip to https://bugsnag.com/blog/replacing-the-rails-asset-pipeline-with-gulp for the great intro on how to use gulp instead of sprockets as asset pipeline.

defsprite
  • 615
  • 5
  • 7
  • I will try that, but, then again, I would need to incorporate Rails.root to the file generated by Gulp, right? Is Rails.root available to Gulp? – Jonathan Soifer Dec 09 '15 at 00:45
  • 1
    I don't think so, as long as you have a `gulpfile.js` in that directory and run it from there, you be able to configure it relative to the local directory (`"."`). Please note that it is probably a better idea to generate all the assets into `public/assets`, as `app/assets` will not be served by the rails app without further configuration. – defsprite Dec 13 '15 at 11:09