JavaScript file per view in Rails

As per 'unobtrusive JavaScript' recommendations I want to separate my JavaScript logic into
separate files. However I don't know how to organize them.

Should I:

  1. Just throw all application javascript into Application.js file and load it with layout page? This is simple approach but I will end up with a bloated Application.js. Some users might want to visit only a couple of pages, but this entire file would preloaded which is not good.
  2. Or should I create a separate javaScript file for each view and load them independently? This creates a set of questions. How to link each js file to corresponding view?



Load the main JavaScript in application.js every time. Now create files for different needs. Create a form.js file, a myfancypart.js file etc. Don't load them in the application.html.erb layout. Load them dynamically when you need them:


<%= javascript_include_tag "application" %>
<%= yield :javascript_includes %>

top of your view.html.erb:

<% content_for :javascript_includes do %>
  <%= javascript_include_tag "forms.js" %>
<% end %>

Everything in the content_for block will be loaded at yield :javascript_includes.


I suggest putting it all into one file, which you can then minify and gzip. The client will only have to download it once, as it'll be cached on all subsequent requests.

Another thing that might interest you is sprockets, a javascript dependency manager, which you can install using gem. You can get more information on sprockets from the website ( or from the github page ( It makes writing big javascript applications much more manageable.


This changes with Rails 3.1 and the asset pipeline!!!

Separate files are best as you indicate. The issues about how to reference them all and link them goes away with rails 3.1 which aims to compile them all into single files for production.


One can use Jammit to include css and javascripts files

for detail:


step 1:

Add js-files in assets.yml (see code below)



- app/javascripts/lib/*.js
- app/javascripts/jquery-plugins/*.js
- app/javascripts/custom/*.js
- app/javascripts/application.js


- app/javascripts/core/*.js
- app/javascripts/head/*.js

step 2:

Add simple code in application layout:

<%= include_javascripts :header %>
<%= include_javascripts :footer %>

maybe you want to use application_helper

def javascript(*files)
  content_for(:head) { javascript_include_tag(*files) }

def stylesheet(*files)
  content_for(:head) { stylesheet_link_tag(*files) }


Recent Questions

Top Questions

Home Tags Terms of Service Privacy Policy DMCA Contact Us

©2020 All rights reserved.