Skip to content

Instantly share code, notes, and snippets.

@averyvery
Last active April 4, 2023 15:02
Show Gist options
  • Star 30 You must be signed in to star a gist
  • Fork 6 You must be signed in to fork a gist
  • Save averyvery/6e4576023b395de1aaf5 to your computer and use it in GitHub Desktop.
Save averyvery/6e4576023b395de1aaf5 to your computer and use it in GitHub Desktop.
Inline CSS or JS in Rails
config.assets.precompile += [
# precompile any CSS or JS file that doesn't start with _
/(^inline[^_\/]|\/[^_])[^\/]*.(js|css)$/,
...
def read_file_contents(stylesheet)
if %w(test development).include?(Rails.env.to_s)
# if we're running the full asset pipeline,
# just grab the body of the final output
stylesheet.body
else
# in a production-like environment, read the
# fingerprinted and compiled file
File.read(File.join(Rails.root, 'public', 'assets', stylesheet.digest_path))
end
end
def inline_file(asset_path)
file = Rails.application.assets.find_asset(asset_path)
file.nil? ? '' : read_file_contents(file)
end
def inline_js(asset_path)
"<script>#{inline_file asset_path}</script>"
end
def inline_css(asset_path)
"<style>#{inline_file asset_path}</style>"
end
# use a method like this to automatically load CSS that
# follows the current controller/action name structure
# example: assets/stylesheets/views/users/show.sass
def current_view_stylesheet
inline_css("views/#{params[:controller]}/#{params[:action]}") +
end
@wagoid
Copy link

wagoid commented Sep 25, 2017

@averyvery you could also leverage Rails cache when reading the file contents, replacing this:
File.read(File.join(Rails.root, 'public', 'assets', stylesheet.digest_path))
by this:
render file: File.join(Rails.root, 'public', 'assets', stylesheet.digest_path)

render here will return the actual string with the file contents, because it's being called from a view template 😃
That will avoid a lot of I/O operations and make your users happier!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment