I'm running a rails 3.2.11 on heroku. My scripts are loaded twice, resulting in:
<script src="/assets/jquery-08bbde0e2625ba65b3f4d03e5cf1c05d.js?body=1" type="text/javascript"></script>
<script src="/assets/jquery_ujs-a3266ec390218bd1ea234887ff70ab4e.js?body=1" type="text/javascript"></script>
<script src="/assets/dropdown-504c410c0872c88a73fa906195712053.js?body=1" type="text/javascript"></script>
<script src="/assets/registration-db60840d5dd61a97052f0d3fe669f478.js?body=1" type="text/javascript"></script>
<script src="/assets/jquery.Jcrop-9819495b75d1a185b32ae5bcf2b071fe.js?body=1" type="text/javascript"></script>
<script src="/assets/clean-42820428d4061c499712d032b87a19e7.js?body=1" type="text/javascript"></script>
<script src="/assets/application-5a65a574df27b941748dc66c7373b32b.js?body=1" type="text/javascript"></script>
All of them jquery, jquery_ujs, dropdown, registration, jquery.Jcrop and clean are also concatenated (and minified) in application. I don't get why these files are still loaded when only application should be loaded.
Here is the content of application.js:
//= require jquery
//= require jquery_ujs
//= require dropdown
//= require 'registration'
//= require 'jquery.Jcrop'
//= require clean
How I include it in my layout:
= javascript_include_tag 'application'
Content of application.rb (part concerning assets):
# Enable the asset pipeline
config.assets.enabled = true
config.assets.initialize_on_precompile = false
# Do not compress assets
config.assets.compress = false
# Expands the lines which load the assets
config.assets.debug = true
config.assets.precompile += [
'active_admin.js',
'application.js',
'landing.js.coffee',
'active_admin.css.scss',
'application.css.sass',
'landing.css.sass'
]
Content of production.rb (part concerning assets):
# Compress JavaScripts and CSS
config.assets.compress = true
# Don't fallback to assets pipeline if a precompiled asset is missed
config.assets.compile = true
# Generate digests for assets URLs
config.assets.digest = true
It looks like your issue is that you have config.assets.debug = true set in production. Try adding config.assets.debug = false to production.rb.
Related
We've just deployed a Rails 4.0.3 app to production and have found that asset paths generated by stylesheet_link_tag and javascript_link_tag are missing their fingerprints. So instead of requesting something like application-c841bd1c82c25bb1de8452d2338479f7.js, the page is just request application.js.
RAILS_ENV=production bundle exec rake assets:precompile is successful and generates fingerprinted files.
The bits from config/environments/production.rb that seem relevant are:
# Compress JavaScripts and CSS
config.assets.compress = true
# Don't fallback to assets pipeline if a precompiled asset is missed
config.assets.compile = false
# Generate digests for assets URLs
config.assets.digest = true
# Disable Rails's static asset server (Apache or nginx will already do this)
config.serve_static_assets = false
This is running on our own Apache server, not Heroku. I've looked around quite a bit and found similar problems, but none of the troubleshooting steps for those are helping here. Thanks.
More Information
In case it is helpful, here are the full contents (commented lines removed) of our config files:
application.rb
require File.expand_path('../boot', __FILE__)
require 'rails/all'
if defined?(Bundler)
# If you precompile assets before deploying to production, use this line
Bundler.require(*Rails.groups(:assets => %w(development test)))
# If you want your assets lazily compiled in production, use this line
# Bundler.require(:default, :assets, Rails.env)
end
module Ctrc
class Application < Rails::Application
config.ceal.application_title = "CTRC Budgeting"
config.encoding = "utf-8"
config.filter_parameters += [:password]
config.active_support.escape_html_entities_in_json = true
config.assets.enabled = true
config.assets.version = '1.0'
config.pmacs_redmine.project_identifier = 'itmat-gcrc'
config.app_data_path = '/data/web/apps/itmat/ctrc'
config.paperclip_defaults = {
path: "/data/web/apps/itmat/ctrc/:attachment/:id/:style/:basename.:extension"
}
if ENV['RAILS_RELATIVE_URL_ROOT']
config.assets.prefix = ENV['RAILS_RELATIVE_URL_ROOT'] + '/assets'
end
end
end
production.rb
Ctrc::Application.configure do
config.cache_classes = true
config.consider_all_requests_local = false
config.action_controller.perform_caching = true
config.serve_static_assets = false
config.assets.compress = true
config.assets.compile = false
config.assets.digest = true
config.i18n.fallbacks = true
config.active_support.deprecation = :notify
config.eager_load = true
end
I know that the application is running in production mode because if I set
config.assets.compile = true
in that file, the CSS and JavaScript are compiled and requested correctly.
I'm including those assets in the page like so:
<%= stylesheet_link_tag "application", media: "all" %>
<%= javascript_include_tag "application" %>
but it is still generating links to those assets like this:
<link href="/apps/itmat/ctrc/stylesheets/application.css" media="all" rel="stylesheet">
<script src="/apps/itmat/ctrc/javascripts/application.js"></script>
instead of the fingerprinted links I would expect to see.
I had a similar issue and it turned out to be a problem with the gem AssetSync. Either setting config.assets.compile = true or removing the gem resolved the issue. Compiling assets on the fly and having your Rails serve your assets might be acceptable if you're using a CDN, but generally, taking another approach is usually recommended.
For rails 4.x be sure to set the following:
config/application.rb
config.assets.enabled = true
config.assets.version = '1.0'
config/environments/production.rb
config.assets.compile = false
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.
I'm new in Rails and I'm developing an application using Rails 3.2.0. So, when I work at my local machine all is good, pages have design expected with the following head:
<head>
<title>Ruby on Rails Tutorial Sample App</title>
<link href="/assets/application.css?body=1" media="all" rel="stylesheet" type="text/css" />
<link href="/assets/custom.css?body=1" media="all" rel="stylesheet" type="text/css" />
<link href="/assets/static_pages.css?body=1" media="all" rel="stylesheet" type="text/css" />
<link href="/assets/users.css?body=1" media="all" rel="stylesheet" type="text/css" />
<script src="/assets/jquery.js?body=1" type="text/javascript"></script>
<script src="/assets/jquery_ujs.js?body=1" type="text/javascript"></script>
<script src="/assets/static_pages.js?body=1" type="text/javascript"></script>
<script src="/assets/users.js?body=1" type="text/javascript"></script>
<script src="/assets/application.js?body=1" type="text/javascript"></script>
<meta content="authenticity_token" name="csrf-param" />
<meta content="XWFSZcrp1zLXPwqKvANdCgQWr4ws6sM2xqylAYVprrQ=" name="csrf-token" />
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
</head>
But then I do a commit and push it to Heroku:
git push heroku
But my pages don't have design needed; the head of some page on Heroku:
<head>
<title>Ruby on Rails Tutorial Sample App</title>
<link href="/assets/application-7270767b2a9e9fff880aa5de378ca791.css" media="all" rel="stylesheet" type="text/css" />
<script src="/assets/application-3428e82709d7645135002c8fadfafdc6.js" type="text/javascript"></script>
<meta content="authenticity_token" name="csrf-param" />
<meta content="lSpfx/uG7gZoccxRHqdFBEQArAvQfI/EYXC/G/V79aU=" name="csrf-token" />
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
</head>
I don't know why but "application-....css" file is absolutely clean! How can I fix it? My production.rb:
SampleApp::Application.configure do
# Settings specified here will take precedence over those in config/application.rb
# Code is not reloaded between requests
config.cache_classes = true
# Full error reports are disabled and caching is turned on
config.consider_all_requests_local = false
config.action_controller.perform_caching = true
# Disable Rails's static asset server (Apache or nginx will already do this)
config.serve_static_assets = true
# Compress JavaScripts and CSS
config.assets.compress = true
# Don't fallback to assets pipeline if a precompiled asset is missed
config.assets.compile = false
# Generate digests for assets URLs
config.assets.digest = true
# Defaults to Rails.root.join("public/assets")
# config.assets.manifest = YOUR_PATH
# 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
# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
config.force_ssl = true
# See everything in the log (default is :info)
# config.log_level = :debug
# Prepend all log lines with the following tags
# config.log_tags = [ :subdomain, :uuid ]
# Use a different logger for distributed setups
# config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)
# Use a different cache store in production
# config.cache_store = :mem_cache_store
# Enable serving of images, stylesheets, and JavaScripts from an asset server
# config.action_controller.asset_host = "http://assets.example.com"
# Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added)
# config.assets.precompile += %w( search.js )
# Disable delivery errors, bad email addresses will be ignored
# config.action_mailer.raise_delivery_errors = false
# Enable threaded mode
# config.threadsafe!
# Enable locale fallbacks for I18n (makes lookups for any locale fall back to
# the I18n.default_locale when a translation can not be found)
config.i18n.fallbacks = true
# Send deprecation notices to registered listeners
config.active_support.deprecation = :notify
# Log the query plan for queries taking more than this (works
# with SQLite, MySQL, and PostgreSQL)
# config.active_record.auto_explain_threshold_in_seconds = 0.5
end
What should I change? May be some settings in production.rb must be fixed? Thanks in advance.
Heroku precompiles assets from your application.css file. You shouldn't specify the various css files in the header of the page, which is what it looks like you're doing. You need to make sure that they're in the folder with your application.css file and that your application.css file has the following:
/*
* This is a manifest file that'll be compiled into application.css, which will include all the files
* listed below.
*
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
* or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
*
* You're free to add application-wide styles to this file and they'll appear at the top of the
* compiled file, but it's generally better to create a new file per style scope.
*
*= require_self
*= require_tree .
*/
The *= require_tree . line is the important one. It makes sure it picks up all the css files in the folder and loads them in.
I have a bookmarklet, which needs separate js and css files - i.e. I don't want them compiled as usual into one file.
These are the files that I want to separate from the usual js and css files:
assets/javascripts/bookmarklet/tagger.js
assets/javascripts/bookmarklet/js/bookmarklet.js
assets/stylesheets/bookmarklet/bookmarklet-frame.css
In application.js and application.css I changed //= require_three . to //= require_directory .
And I added:
config.assets.precompile += [ 'bookmarklet/js/bookmarklet.js', 'bookmarklet/tagger.js', 'bookmarklet/bookmarklet-frame.css' ]
to my production.rb and staging.rb.
An application.js and application.css is generated, however, my three separate files are not. Any idea why this is not working?
Make sure you have require_tree instead of require_directory, require_tree adds recursively but require_directory does not. Refer asset pipeline
application.js
//= require jquery
//= require jquery_ujs
//= require_tree .
application.css
/* ...
*= require_self
*= require_tree .
*/
application.html.erb should have these lines
<%= javascript_include_tag "application" %>
<%= stylesheet_link_tag "application" %>
Now when you precompile the assets with command RAILS_ENV=production bundle exec rake assets:precompile in your production you will have(all the js files compiled into one, css into one)
application.html.erb
<script src="/assets/application-908e25f4bf641868d8683022a5b62f54.js"></script>
<link href="/assets/application-4dd5b109ee3439da54f5bdfd78a80473.css" media="screen" rel="stylesheet" />
This is unnecessary as by default application.js, application.css are precompiled.
config.assets.precompile += [ 'bookmarklet/js/bookmarklet.js', 'bookmarklet/tagger.js', 'bookmarklet/bookmarklet-frame.css' ]
Sometimes you may use admin.js for a layout admin.html.erb only then you need to add a line like this in production.rb
Had to move
config.assets.precompile += [ 'bookmarklet/js/bookmarklet.js', 'bookmarklet/tagger.js', 'bookmarklet/bookmarklet-frame.css' ]
to application.rb.
Another solution to consider where moving to application.rb may not be necessary. Instead, add 'production' to :assets in your config/application.rb. 'production' is by default not included in the list.
if defined?(Bundler)
# If you precompile assets before deploying to production, use this line
Bundler.require(*Rails.groups(:assets => %w(development test production)))
# If you want your assets lazily compiled in production, use this line
# Bundler.require(:default, :assets, Rails.env)
end
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.