How to precompile a pdf asset in Rails? - ruby-on-rails

In Rails 3.2.11 app I'm trying to publish my app to Heroku.
In the assets folder I have a pdf subfolder with some pdf files inside.
In my production.rb file I have added the following:
config.assets.precompile += %w[*.png *.jpg *.jpeg *.gif *.pdf]
config.assets.precompile += ["*.js"]
config.assets.precompile += ["*.css"]
config.assets.precompile += ['pdf/*']
config.assets.precompile += %w( ricerca_wg.pdf )
If I check the pdf assets paths on my console I get:
Rails.application.config.assets.paths
# [
# "/Users/Augusto/Sites/wisegrowth/app/assets/images",
# "/Users/Augusto/Sites/wisegrowth/app/assets/javascripts",
# "/Users/Augusto/Sites/wisegrowth/app/assets/pdf",
# "/Users/Augusto/Sites/wisegrowth/app/assets/stylesheets",
# "/Users/Augusto/Sites/wisegrowth/vendor/assets/javascripts",
# "/Users/Augusto/Sites/wisegrowth/vendor/assets/stylesheets",
# "/Users/Augusto/.rvm/gems/ruby-1.9.3-p551/gems/jquery-rails-2.3.0/vendor/assets/javascripts",
# "/Users/Augusto/.rvm/gems/ruby-1.9.3-p551/gems/coffee-rails-3.2.2/lib/assets/javascripts",
# "/Users/Augusto/.rvm/gems/ruby-1.9.3-p551/gems/formtastic-2.1.1/app/assets/stylesheets"
# ]
But when I run
rake assets:precompile RAILS_ENV=production
everything is precompiled BUT the pdf files and in my production app on Heroku I get the following error:
ActionView::Template::Error (ricerca_wg.pdf isn't precompiled):

I don't think a pdf must be "precompiled".
if you just want to access the pdf from your app without using another service like S3, you can just put that pdf folder on your public folder of the rails app, and they will be available on the app as an static file.
www.domain.com/pdf/ricerca_wg.pdf
just be sure that the public/pdf folder isn't in the gitignore and it must work.

I believe the ricerca_wg.pdf is under /Users/Augusto/Sites/wisegrowth/app/assets/pdf/? If not, simply
remove config.assets.precompile += %w( ricerca_wg.pdf )
move ricerca_wg.pdf under /Users/Augusto/Sites/wisegrowth/app/assets/pdf/ - it should be precompiled along with other pdf files from this directory

Related

Rails asset pipeline flattens directories

I've been using asset_sync, to move our static assets to Amazon S3, and I've noticed that when I precompile my assets (using foreman run rake assets:precompile), the base directories get flattened. They go from:
/app
/assets/
/images
image.png
image2.png
/subdir
image3.png
/javascripts
script.js
/stylesheets
style.css
To:
/public
/assets/
image.png
image2.png
/subdir
image3.png
script.js
style.css
It keeps any subdirectories, but the base directories get removed for some reason.
Is it possible to disable this? I'd like to keep my S3 assets organized into directories. I could probably resolve this by adding additional directories so that the structure is the following.
/app
/assets/
/images
/images
image.png
image2.png
/subdir
image3.png
/javascripts
/javascripts
script.js
/stylesheets
/stylesheets
style.css
But that just seems like a dirty solution.
I'm configuring my assets for precompiling with:
Rails.application.config.assets.precompile = []
Rails.application.config.assets.precompile += ['application.js']
Rails.application.config.assets.precompile += Loader.js_files
Rails.application.config.assets.precompile += ['*.css', '*.png', '*.svg', '*.jpg']
My environment has the following variables":
ASSET_SYNC_GZIP_COMPRESSION=true
ASSET_SYNC_MANIFEST=true
ASSET_SYNC_EXISTING_REMOTE_FILES=keep
AWS_ACCESS_KEY_ID=xxxxxxx
AWS_SECRET_ACCESS_KEY=xxxxxxx
FOG_DIRECTORY=aws-example
FOG_PREFIX=/assets/
FOG_PROVIDER=AWS
FOG_REGION=us-west-1
Have you configured asset_sync correctly for the application you are creating?
AssetSync.configure do |config|
config.fog_provider = 'AWS'
config.fog_directory = ENV['FOG_DIRECTORY']
config.aws_access_key_id = ENV['AWS_ACCESS_KEY_ID']
config.aws_secret_access_key = ENV['AWS_SECRET_ACCESS_KEY']
config.prefix = 'assets'
config.public_path = Pathname('./public')
end
Depending on the type of application you need to configure the prefix and the public_path. Check out the Sinatra/Rack support section https://github.com/AssetSync/asset_sync for more information. Hope puts you on the right path.

How to precompile assets without subfolder specific?

How precompile assets without subfolder specific?
Example, my assets is that way:
app/assets
/fonts
/images
sprite.png
/sprite
icon1.png
icon2.png
...
iconX.png
/stylesheets
/javascripts
How I configure assets to precompile without folder /sprite in imagem ?
A year ago this worked for me. I no longer do it, but I don't know why it wouldn't continue to work. Put this into config/application.rb (or config/initializers/assets.rb):
config.assets.precompile = [
lambda do |filename, path|
path =~ /app\/assets/ &&
!%w(.js .css).include?(File.extname(filename)) &&
path !~ %r{app/assets/images/sprite/}
end,
/(?:\/|\\|\A)application\.(css|js)$/
]
You may want to update the above to better match what's in the source below. Looks like it's changed a little bit, but this should get you where you need to go.
See https://github.com/rails/sprockets-rails/blob/master/lib/sprockets/railtie.rb#L61

How to precompile assets and avoid "Error: file isn't precompiled" on specific pages?

When I push my code to Heroku I get the following message:
Precompiling assets failed, enabling runtime asset compilation
Runtime compilation can cause issues, so I added the following line to config/application.rb:
config.assets.initialize_on_precompile = false
(As suggested at Error pushing to heroku - aborting my rake assets:precompile and on Heroku Help )
This allows the precompilation to work. However, some of my pages include other javascript files. For example, I include a file from 'vendor/javascripts' within certain pages by putting a tag on the specific page:
<%= javascript_include_tag "src/ace.js" %>
When I visit such a page, it causes the following error (when precompiling works):
ActionView::Template::Error: src/ace.js isn't precompiled
How can I fix it so such pages do not throw errors?
You'll need to add the file to the assets.precompile.
Add the following to your config/environments/production.rb to compile all your css/js files:
config.assets.precompile = ['*.js', '*.css']
You can add your ace.js and other required files in a javascript file for instance "custom.js"
Then you can use your regular code to include the file
Add the following in custom.js. ( Assumed ace.js resides in vendor/javascripts)
//= require ace
Add the file to compilation list by adding following in application.rb
config.assets.precompile += %w( custom.js )
You can now use your javascript_tag to include the source
<%= javascript_include_tag "custom" %>

Asset pipeline a few css file not found for rails [duplicate]

This question already has answers here:
ActionView::Template::Error (960.css isn't precompiled)
(3 answers)
Closed 9 years ago.
This is my css file, but only admin_layout.css.scss and admin_style.css.scss not found.
I could not upload photo, so I wrote a blog.
my blog: Rails a few css not found 404
In your config/application.rb you need to add the following
config.assets.precompile += %w[ admin_layout.css admin_style.css ]
You can learn more about this in the Asset Pipeline Rails Guide. Specifically
The default matcher for compiling files includes application.js, application.css and all non-JS/CSS files (i.e., .coffee and .scss files are not automatically included as they compile to JS/CSS):
[ Proc.new{ |path| !File.extname(path).in?(['.js', '.css']) }, /application.(css|js)$/ ]
If you have other manifests or individual stylesheets and JavaScript files to include, you can add them to the precompile array:
config.assets.precompile += ['admin.js', 'admin.css', 'swfObject.js']

How do I use config.assets.precompile for directories rather than single files?

How do I use config.assets.precompile in production to only include the files in 'lib/assets/javascripts', 'lib/assets/stylesheets', 'vendor/assets/javascripts' and 'vendor/assets/stylesheets'?
Basically something like:
config.assets.precompile += %w( pagespecific.js anotherpage.js )
But used to auto include files in specific directories that are not 'app/assets/javascripts' or 'app/assets/stylesheets'.
*edit: adding the solution I ended up using for page specific js
config.assets.precompile += ['pages/*.js']
You can simply write it like this:
config.assets.precompile += ['directory/*']
The point of compiling assets is to build one (or a small number of) files to minimize the number of HTTP requests from the browser.
If you're going to serve each file individually, then why not just disable precompile?
To use precompile as intended, build an entire directory into one file using Sprockets' require_directory:
//= require_directory ./awesome_js_app
...and list that file in your config.assets.precompile array.
By default, all CSS is built into application.css & JS into application.js. You can add more top-level files to compile with the precompile directive in config/environments/production.rb (and other envs if you wish.) For example:
config.assets.precompile += %w( public.css public.js )
Then the Sprockets //= require ... directives in those top-level files will determine the composition of final compiled file.
You can use these additional top-level files in your layouts to have different CSS & JS for certain views.
It's probably a bit better to include this as an asset path(as per your example solution it would be):
config.assets.paths << Rails.root.join('app', 'assets', 'javascripts', 'pages')
It also allows you to include paths not in the assets directory (for example with including the bootstrap-sass). These paths are then added to your assets folder in your public directory, and pushed to your asset location if using something like asset_sync.
I found this link, and think may be it helpful for you, please see
keithgaputis's answer. Rails config.assets.precompile setting to process all CSS and JS files in app/assets
I think you can do like following.
# In production.rb
config.assets.precompile << Proc.new { |path|
if path =~ /\.(css|js)\z/
full_path = Rails.application.assets.resolve(path).to_path
app_assets_path = Rails.root.join('app', 'assets').to_path
if full_path.starts_with? app_assets_path
puts "excluding asset: " + full_path
false
else
puts "including asset: " + full_path
true
end
else
false
end
}
As of Sprockets 3 you can use a manifest.js file to declare which files or directories are precompiled. See upgrade docs. So in your config you would add:
config.assets.precompile = %w(manifest.js)
Then in app/assets/config/manifest.js you can have
//= link_directory ../pages .js
Use link_tree if you want js files in nested sub-directories to be precompiled too.

Resources