-
-
Save averyvery/6e4576023b395de1aaf5 to your computer and use it in GitHub Desktop.
| 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 |
.source works for Rails 5.
I forked it and tweaked for Rails 5 https://gist.github.com/Dagnan/175168c456629a4ad1acdba8e0cdedb9
FYI - I couldn't get this to work in Rails 3.2 with Sprockets 2.2.3. Here's what I did (created independently of this code, but posting here for anyone who needs some help):
module StylesheetsHelper
private
def include_inline_stylesheet(file)
content_for :stylesheets do
content_tag("style", inline_stylesheet_source(file).html_safe, type: "text/css")
end
end
def inline_stylesheet_source(file)
path = file.pathmap("%-1d")
filename = File.basename(file, ".html.erb").titleize.parameterize
if Rails.env.development? || Rails.env.test?
Rails.application.assets["responsive/inline/#{path}/#{filename}"].body
else
asset_path = ActionController::Base.helpers.asset_path("responsive/inline/#{path}/#{filename}.css")
File.read("#{Rails.root}/public#{asset_path}")
end
end
endAnd then in my views I add <%= include_inline_stylesheet(__FILE__) %> and I have a <%= yield :stylesheets %> in my <head>.
CSS files are in the format of responsive/inline/orders/index.css.scss (Note that this code replaces underscores with dashes in the filename, so my_file.html.erb becomes my-file.css).
This is genius. Thank you a lot, @averyvery and @Dagnan!
@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!
Should
stylesheet.bodybestylesheet.sourceinstead?Source: https://github.com/rails/sprockets/blob/master/lib/sprockets/asset.rb#L26