Rails assets pipelines + git submodules - ruby-on-rails

I am trying to use Skeleton with Ruby on Rails. What I want to do is to put the Skeleton directory in the vendor directory as a git submodule in order to have something similar to this:
...
vendor/
...
Skeleton/
...
stylesheets/
robots.txt
I tried to add the following line to config/application.rb:
config.assets.paths << Rails.root.join("vendor", "assets", "Skeleton", "stylesheets")
It added the stylesheet folder to the assets pipeline's paths but the files in the stylesheet directory still give a routing error...
How can I make this work please?
PS: I want to have Skeleton as a git submodule in vendor/assets so separating the files is not an option.

It's depends how you try to use this files. I have made a simple test app with Skeleton as submodule and it works. You can see it here.
If don't want to require skeleton css in application.css and use it as separated precompiled file you neeed tell rails to precompile that file. In your application.rb:
config.assets.precompile << 'skeleton.css'

Related

Rails 4 not recursively sourcing lib/assets directory or application_lib.js manifest

$ rails --version
Rails 4.0.1
I want to be able to have a separate manifest file, root_dir/lib/javascripts/application_lib.js, so I can add lines like require_tree . to recursively search .js files under lib/
But I can't figure out how.
In my application.rb file
config.assets.paths << "#{Rails.root}/app/assets/videos"
config.assets.paths << "#{Rails.root}/lib/assets/"
config.assets.initialize_on_precompile = false
Interestingly if I put a pile in root_dir/lib/assets/javascripts/greeting.txt, greeting.txt is sourced (localhost:3000/assets/greeting.txt finds the file).
But if I put it in root_dir/lib/assets/stylesheets/greeting.txt, it cant find it. Which means that http://guides.rubyonrails.org/asset_pipeline.html#asset-organization is wrong.
I even had to add the root/lib/ to my config.assets.paths, it didn't source /lib/ automatically.
Also, I tried making another manifest file under root/lib/javascripts/application.js, but it is not being read as a manifest file and all the recurive files underneath root/lib/javascripts/test/greeting.txt is not being sourced....
How do I recursively source javascript and stylehseets under the lib/ or vendor/ directory ? The only elegant way I can think of is making a new manifest file under lib/javascripts and etc but that hasn't been working...
Thanks!

Jekyll blog in Rails site using Bloggy gem: how do I use the Rails css for the blog, on each build?

I've got a Rails site with a Jekyll blog incorporated, using the Bloggy gem.
I'd like a similar look for the main site and the blog, so I want to use the css in app/assets/stylesheets, but those files are in css.scss format. Jekyll (in a Bloggy setup) looks for css in config/jekyll/css, and seems to only want .css files; symlinking the Rails css directory into the Jekyll hierarchy doesn't seem to to work.
Is there a way to take advantage of the asset pipeline so that when I run jekyll:build, SCSS files from the Rails app are made into CSS files, placed in the appropriate jekyll directory, and bundled with the latest Jekyll build as it's placed into the /public/blog folder?
Thanks!
Ended up getting through this by:
Using the jekyll-sass gem to allow automatic transformation of the Rails app's .css.scss into .css.css files. By symlinking the Rails app/assets/stylesheets directory into Bloggy's config/jekyll/css, this put files with the right content but wrong extensions in the correct place.
Writing a rake task to make the .css.css files into .css files.
desc 'Make .css.css files into .css files'
task :css_css do
Dir.glob('public/blog/css/*.css.css').each do |file|
puts `mv #{file} #{file.gsub(/\.css\.css$/, '.css')}`
end
end
Not the prettiest solution, but it works.
#Matthew.. You have a nice solution.. For this part I did some stuffs manually. Like I added config/jekyll/css files as .css extension rather than .css.scss so when we run "rake generate" for bloggy the right format files are created on the folder public/blog/ rather css.scss.
I have made the changes in my bloggy portfolio theme project repository. If you are planning to use my version of code, I have did some changes like added robots.txt, sitemap, and integrated bootstrap to the project. I have also removed all database connections from the rails project since it was showing errors while deploying into heroku.

rake assets:precompile for specific JS file

Could I run rake assets:precompile for specific JavaScript file?
Otherwise the full precompile lasts for 5 minutes and makes quick changes in JavaScript files very annoying.
If you wanted to precompile just one file, you could make a custom rake task to do so fairly easy.
namespace :assets do
desc "compile one js file"
task :compile_one_file => :environment do
dest = "#{Rails.root}/vendor/assets/javascripts/compiled/"
js_asset = "your_jsfile.js"
File.write(dest + js_asset, Uglifier.compile(Rails.application.assets.find_asset(js_asset).to_s))
end
end
then from the command line
rake assets:compile_one_file
Hope this helps, I find this useful for vendor js files that I don't change often such as jquery and jquery plugins. That way when im in development it speeds up my page loads keeping the asset pipeline from having to route all the separate requests for my vendor files. It just serves up one minified js file of all my vendor js.
Short: You can't.
During precompilation Rails goes through the Application.js file and merges all imports into one so just changing one file is simply not possible due to the compression that goes on in there. (It doesn't do anything to files not referenced from application.js)
Next up: You should not have to run rake assets:precompile during development when doing quick fixes. Only on deployment where (depending on your patience) it should be no problem having the task run 5 minutes.
You should be using the development environment during development where asset precompilation is not necessary because Rails will serve the assets unmerged and un-minified.
If you are running the Rails build in web-server through rails s this should be by default, but you can explicitly start the rails server using:
rails s RAILS_ENV=development
If the assets are still not correctly displayed or you see errors make sure you have config.assets.debug = true
#Tigraine is partially correct. Rails 3.1+ assets are intended to be fully managed by Rails and by default all assets will be compiled down to one js and one css asset.
HOWEVER...
Compiling down to a single asset relies on the use of an asset manifest (application.js and application.css) that is processed by the Sprockets gem. By default these manifests include a require_tree directive and it's that directive that includes all the files. If you remove that directive, you've got to do a bit more work to get your assets compiled.
If you want to build separate assets you can set a config option in application.rb.
config.assets.precompile += %w( additional/asset.css funky/stuff.js )
The above line would add the files additional/asset.css and funky/stuff.js to the list of files that would be produced when the assets are precompiled (Note that the '+=' is being used to extend the default list). To be as explicit as possible this means that you would have four assets precompiled: application.js, funky/stuff.js, application.css, and additional/asset.css.
That said, you might want to check out the guard-rails-assets gem. The gem is flexible in the way it supports precompiling; precompiling only changed assets is possible. I've heard some good feedback about it but not used it myself.
#Tigraine isn't correct.
It's possible, you just have to create folders and put the css files in them and import it to different files in the assets folder.
Like
application.css
*= require_self
*= require foundation_and_overrides
*= require reset
*= require_tree ./screen
Where Screen is a folder I've placed inside the stylesheet folder. like assets/stylesheets/screen/. I call the application.css with
<%= stylesheet_link_tag "application", media: "screen, projection" %>
Now, if you want to create a single css file for another layout you create that under assets/stylesheets
Like xxx.css
If you need multiple files for xxx you follow the same steps as above but the important part here is that you add this line to
production.rb
config.assets.precompile += %w( xxx.css )
Then inside the layout you add:
<%= stylesheet_link_tag "xxx", media: "screen, projection" %>
You can do this completely without Rails. This can make things run faster depending on your environment.
quick_compile.rb
require 'sprockets'
sprocket = Sprockets::Environment.new
sprocket.js_compressor = :uglifier # or read off config yml
sprocket.append_path('app/assets/javascripts') # the directory that holds you js src.
file = File.new('test_min.js','w+') # the output file path.
file.puts(sprocket.find_asset('test.js')) # the file to complie
file.close
If you just want to evalute the //= require statement, you can remove the js_compressor setting. Sprocket will concatenate the files required.

Rails 3.2 asset pipeline issue

I have a JS file defined in the app - app/assets/javascripts/client/some-client.js.coffee
In my dev env I can access this file via URL - /assets/client/some-client.js
But I cannot do the same in production? ...meaning the URL does not work, what could be wrong?
In prod, you will have access only to precompiled files, if you use the default configuration.
You can define which assets to precompile in config/environments/production.rb:
config.assets.precompile += %w( some-client.js blabla.js some-client.css ) #etc...
Run rake assets:precompile to... precompile your assets.
Learn more with this guide: http://guides.rubyonrails.org/asset_pipeline.html
If you didn't find it yet, be sure that you are accessing it through <%= javascript_include_tag "some-client" %>. As the asset pipeline handles finding where it has precompiled the asset. Along with the config.assets.precomile += %( some-client.js ). Also, if the helper function can't find that in production you might want to try moving client/ to assets/javascript/client I think it looks for assets for example javascripts files in app/assets/javascripts/ lib/assets/javascripts/ and vendor/assets/javascripts/ if I understand the asset pipeline. And it looks like you don't have it in any of those files, so it may be skipping it since it doesn't see it.
EDIT:
Looks like you have it in javascripts/ sorry. The asset pipeline should traverse subdirectories.

Precompiling a .scss manifest file using Rails 3.1's asset pipeline

The release version of Rails 3.1 is having some weird issues with precompiling a sass manifest file with the extension scss. The weird thing is that the default manifest file application.scss compiles fine and I see it under public/assets/.
However when I try to compile my custom manifest files, nothing is created. I have enabled the precompile option in the production config.
config.assets.precompile += %w( user.scss admin.scss )
I am running the precompile rake task correctly as far a I know.
rake assets:precompile RAILS_ENV=production
And maybe this helps. When I create two new manifest files with the extension css instead of scss and require the original scss files in them, then these new manifest files are honored and properly compiled. Why does application.scss get this special treatment and not other sass manifest files?
Include the compiled filenames in your precompile list:
config.assets.precompile += %w( user.css admin.css )
Also, you may want to to rename the original files in app/assets/stylesheets to include the compiled extension in the original filenames so it's clear what is going on:
user.scss -> user.css.scss
admin.scss -> admin.css.scss
I suspect it might be bug.
The application files are treated as the main files for a default project. The one ending in .css and .js are included in the precompile list by default.
The behavior you describe (manifests having a .css extension) is the correct one.

Resources