Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Configure Rails to use different js in development and production

I want Rails to inject different js files in development and production modes.

Example:

Development:

<script src="/javascripts/jquery.js" type="text/javascript"></script>
<script src="/javascripts/myscripts.js" type="text/javascript"></script>

Production:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
<script src="/javascripts/myscripts.min.js" type="text/javascript"></script>

Is it possible to achieve it in Rails 3?

Regards, Alexey Zakharov

like image 867
Alexey Zakharov Avatar asked Sep 14 '10 18:09

Alexey Zakharov


2 Answers

From at least Rails 3, you can pass the javascript_include_tag helper the symbol :defaults which is defined inside your config/application.rb at the variable config.action_view.javascript_expansions[:defaults] =

This will currently be commented out and will always at least include application.js.

If you want to define a different set of defaults for production and development then leave this line commented out and open up config/environments/production.rb and config/environments/development.rb. Any settings defined in here will override any set in application.rb and only apply in the relevant environment. For your example, you would want the following:

# development.rb
config.action_view.javascript_expansions[:defaults] = %w(jquery.js myscripts.js)

# production.rb
config.action_view.javascript_expansions[:defaults] = %w(http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js myscripts.min.js)
like image 188
Rupert Madden-Abbott Avatar answered Sep 29 '22 05:09

Rupert Madden-Abbott


You could have a helper method load your js and perform the condition check as to which environment it is.

app/views/layouts/application.html.* (wherever you normally include your javascript)

load_javascript

app/helpers/application_helper.rb

def load_javascript
  if Rails.env.production?
    javascript_include_tag 'js1', 'js2', :cache => true
  else
    javascript_include_tag 'js3', 'js4'
  end
end

You could DRY it up a little further by having load_javascript only give you back a list of the files and have only one javascript_include_tag.

like image 26
theIV Avatar answered Sep 29 '22 04:09

theIV