I am attempting to get a Rails 4 application running with RAILS_ENV=production.
My objective is to precompile assets and use a CDN to serve them quickly.
What I have done so far
production.rb
config.serve_static_assets = false
config.action_controller.asset_host = "http://mycdn.cloudfront.net"
config.assets.js_compressor = :uglifier
config.assets.compile = false
Precompile step that runs correctly during opsworks deploy
"/usr/local/bin/bundle exec rake assets:precompile"
Output From Precompile
/srv/www/myapp/current/public/assets/$ ls
application-<digest>.css
application-<digest>.js
... other images, etc...
Using rails helper tags for .js and .css in /application.html.slim
= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true
= javascript_include_tag 'application', 'data-turbolinks-track' => true
= favicon_link_tag 'favicon.png'
What did I expect
On page load I would see things like (expected digest in url):
<link data-turbolinks-track="true" href="http://mycdn.cloudfront.net/stylesheets/application-<digest>.css" media="all" rel="stylesheet" />
What actually happens
On page load I see things like (NO DIGEST in url!):
The bad news is they are missing, since application.css doesnt exist anywhere in my app, the CDN cant cache it, naturally.
<link data-turbolinks-track="true" href="http://mycdn.cloudfront.net/stylesheets/application.css" media="all" rel="stylesheet" />
Any help would be much appreciated.
Random stats:
- Rails 4.1.5
- Unicorn 4.8.1
- Opswork stack as my deploy target
- Cloudfront as my CDN
You need to add this to your production.rb file ( and any other environnent that you want to have digests in )
config.assets.digest = true
Related
I'm running the latest version of Thin, Rails, and Ruby. The relevant parts of my build script are:
export RAILS_ENV=production
export RAILS_SERVE_STATIC_FILES=true
# generate static assets
RAILS_ENV=production rake assets:precompile
# restart server
rails server thin -d
And in my production.rb I have
config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?
And I include these files in my view using
<%= stylesheet_link_tag 'application', media: 'all' %>
<%= javascript_include_tag 'application' %>
This successfully compiles my assets and moves them to the /public/assets folder. However, none of these assets are actually served when loading the page. The generated HTML is
<link rel="stylesheet" media="all" href="/stylesheets/application.css" />
<script src="/javascripts/application.js"></script>
These don't have the digests included in the filename, so I believe they're incorrect. Attempting to manually load the filenames both with and without their digest included all fail with a 404 as well. What am I doing wrong?
put the js files under app/assets/javascript.
put the css files under app/assets/stylesheets.
All your js and css files are loaded in the header of application.html.erb, which loads the application.css and application.js. This is what these two lines of code does.
<%= stylesheet_link_tag 'application', media: 'all' %>
<%= javascript_include_tag 'application' %>
These two files, there is a line require_tree . which loads all the files in the corresponding directory:
app/assets/javascript
app/assets/stylesheets
I usually use public folder only for external libraries when I am not using a CDN. And you will need to explicitly include them in the application.js and application.css file.
An application error constantly occurs:
2014-11-26T06:45:10.349830+00:00 app[web.1]: ActionController::RoutingError (No route matches [GET] "/stylesheets/application.css"):
In my application.html I have:
<%= stylesheet_link_tag "application" %>
In my production.rb, because heroku is not serving and the application should serve static assets I have:
config.serve_static_assets = true
config.assets.compile = true
On the live site I have:
<link href="/assets/application-da7e0e08bb87fbae6f1225fa189fab8e.css" media="screen" rel="stylesheet" type="text/css" />
The url
mysite/assets/application-da7e0e08bb87fbae6f1225fa189fab8e.css
returns a result.
The url
mysite/assets/application.css
also returns a result.
Everything is working fine, but there is this error message in the log and I can not understand why. Who requests /stylesheets/application.css and why and how to stop this error from occurring.
Rails is "3.2.16"
There should be two problems:
1) add %<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>>
2) It looks like you have added assets precompiled file in your git repo. Ideally, it shouldn't be there since heroku can this for you whenever you push it.
To fix this, you have to do this
git rm -r public/assets/
add public/assets/** in your .gitignore file
git add .
git commit -am "allow heroku auto assets precompilation"
5.git push heroku master
I precompile my assets and use following function to render html:
= stylesheet_link_tag "frontend/application", media: "all", "data-turbolinks-track" => true
= javascript_include_tag "frontend/application", "data-turbolinks-track" => true
Sometimes those methods generat correct html:
<link data-turbolinks-track="true" href="/assets/frontend/application-64cf06dd4d2386f145e00844fed60d28.css" media="all" rel="stylesheet" />
<script data-turbolinks-track="true" src="/assets/frontend/application-447281961c979f73e944369c4b832fd8.js"></script>
But on production rails sometimes (50%!) generates assets html like this
<link data-turbolinks-track="true" href="/stylesheets/frontend/application.css" media="all" rel="stylesheet" />
<script data-turbolinks-track="true" src="/javascripts/frontend/application.js"></script>
I use heroku on production. Any idea what could be wrong or how can I fix this?
Below are my production settings.
# Disable Rails's static asset server (Apache or nginx will already do this).
config.serve_static_assets = true
# Debug mode disables concatenation and preprocessing of assets.
# This option may cause significant delays in view rendering with a large
# number of complex assets.
config.assets.debug = true
# Compress JavaScripts and CSS.
config.assets.js_compressor = :uglifier
config.assets.css_compressor = :sass
# Do not fallback to assets pipeline if a precompiled asset is missed.
config.assets.compile = false
# Generate digests for assets URLs.
config.assets.digest = true
# Version of your assets, change this if you want to expire all your assets.
config.assets.version = '2'
# Specifies the header that your server uses for sending files.
# config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
# config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
Here is also preview of the problem: view-source:http://v5.megabon.com/en
The only way to get it work on Heroku was to set compile to false
config.assets.compile = false
And delete every precompiled file in public folder. That forces Heroku to recompile assets on every git push.
When I run
rake assets:precompile
The compiled assets are written to pubic/assets:
I, [2013-07-21T02:16:00.987988 #13881] INFO -- : Writing /home/jpereira/dev/saleshub/public/assets/glyphicons-halflings-white-62b67d9edee3db90d18833087f848d6e.png
I, [2013-07-21T02:16:01.037698 #13881] INFO -- : Writing /home/jpereira/dev/saleshub/public/assets/glyphicons-halflings-c806376f05e4ccabe2c5315a8e95667c.png
I, [2013-07-21T02:16:01.053630 #13881] INFO -- : Writing /home/jpereira/dev/saleshub/public/assets/marketing/slider-base/slide-01-b85e542137a02bedd6c30dede873ef1e.jpg
I, [2013-07-21T02:16:01.066371 #13881] INFO -- : Writing /home/jpereira/dev/saleshub/public/assets/marketing/slider-base/slide-02-e5106e911d8a0289bfaf2ac64308a640.jpg
I, [2013-07-21T02:16:01.077879 #13881] INFO -- : Writing /home/jpereira/dev/saleshub/public/assets/marketing/slider-base/slide-03-990dccbed4c70f0118b7d30d98094811.jpg
I, [2013-07-21T02:16:01.965560 #13881] INFO -- : Writing /home/jpereira/dev/saleshub/public/assets/application-98713f9763bccfd6bc05dae422d3e242.js
I, [2013-07-21T02:16:02.068469 #13881] INFO -- : Writing /home/jpereira/dev/saleshub/public/assets/application-a40c2cd9b0f20b2a7f3b62d45159fbb3.css
Then, I start the application in production, with:
RAILS_ENV=production rails s
=> Booting WEBrick
=> Rails 4.0.0 application starting in production on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2013-07-21 02:20:49] INFO WEBrick 1.3.1
[2013-07-21 02:20:49] INFO ruby 2.0.0 (2013-06-27) [x86_64-linux]
[2013-07-21 02:20:49] INFO WEBrick::HTTPServer#start: pid=13903 port=3000
But the rendered pages, don't look for the precompiled asses. In the rendered templates I got:
<!DOCTYPE html>
<html>
<head>
<title>App Home Pagetitle>
<link data-turbolinks-track="true" href="/stylesheets/application.css" media="all" rel="stylesheet" />
<link href="/stylesheets/application.css" media="all" rel="stylesheet" />
<link href="/stylesheets/marketing.css" media="all" rel="stylesheet" />
<script src="/javascripts/application.js"></script>
<script src="/javascripts/marketing.js"></script>
<meta content="authenticity_token" name="csrf-param" />
<meta content="8XQYBZWrTxmfdGvQYCK0JwQDfr2pt8si+FjW4a30SsA=" name="csrf-token" />
</head>
<body>
</body>
</html>
The template is the following:
!!! 5
%html
%head
%title App Home Page
=yield(:head)
= stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true
= stylesheet_link_tag "application", params[:controller], :media => "all"
= javascript_include_tag "application", params[:controller]
= csrf_meta_tags
%body
=flash_messages(flash)
= yield
My production.rb is as follows:
WebApp::Application.configure do
config.cache_classes = true
config.eager_load = true
config.consider_all_requests_local = false
config.action_controller.perform_caching = true
config.serve_static_assets = false
config.assets.js_compressor = :uglifier
config.assets.compile = false
config.assets.digest = true
config.assets.version = '1.0'
config.log_level = :info
config.i18n.fallbacks = true
config.active_support.deprecation = :notify
config.log_formatter = ::Logger::Formatter.new
end
What I need to configure to have stylesheet_link_tag and javascript_include_tag pick the right assets location on production?
Thanks
I just finished writing a similar question, when yours came up in the related sidebar :)
I found a blog that suggests this is a bug, and is inexplicably mitigated by setting
config.assets.compile = true
In the end I answered my own question.
If your creating assets in subfolders you need to prefix your files with the path to the file:
config.assets.precompile += %w( admin/admin.css admin/admin.js ). You'l find this command commented out in environments/production.rb
setting config.assets.compile = true is a bad idea, its slow and not necessary.
Once you've added your custom assets to config.assets.precompile, run:
bundle exec rake assets:precompile RAILS_ENV=production in the terminal to compile the assets.
I believe you may want to look at the following: that states: Edge Rails Guide
In Rails 4.0, precompiling assets no longer automatically copies non-JS/CSS assets from vendor/assets and lib/assets. Rails application and engine developers should put these assets in app/assets or configure config.assets.precompile.
Further to this I believe you can do specify your JS files by doing the following in your config/application.rb
config.assets.precompile += %w( 'application.js', 'application.css',
#specify CSS or JS files inside here! )
Then execute:
bundle exec rake assets:precompile RAILS_ENV=production
I'm using stylesheet_link_tag with the asset pipeline and yet I get this:
<link href="/assets/application.css" media="screen" rel="stylesheet" type="text/css" />
My production.rb
config.serve_static_assets = false
config.assets.compress = true
I'm assuming it's the settings or something simple..
Make sure this setting is true:
# config/environments/production.rb
config.assets.digest = true
and that you've run rake assets:precompile.