Fallback for CDN asset loading

52 views
Skip to first unread message

Karel

unread,
Oct 17, 2011, 4:02:59 PM10/17/11
to rubyonra...@googlegroups.com
Hi,

What would you think to add a fallback option to javascript_include_tag?

If I load dojo from Google CDN, I'd like a fallback. The easiest way to do so is by putting a script tage right after it:
<script>typeof(dojo) === "undefined" && document.write(unescape('%3Cscript src="assets/javascripts/dojo.js"%3E%3C/script%3E'));</script>

But the dojo library should go in your /vendors/assets/ not in your /public/assets. To get it served, I need to play with the config.assets.precompile if I understand well. Anyway, it all seem very hacky too me.

What would you think of being able to do something like that:
= javascript_include_tag "http://ajax.googleapis.com/ajax/libs/dojo/1.6.1/dojo/dojo.xd.js", :test => 'typeof(dojo) === "undefined"', :local => 'local/path/to/dojo'
That way rails take care of putting the extra <script> tag for us with the test and most importantly, can precompile the file and set the good path. 
What do you think?

Tim Shaffer

unread,
Oct 17, 2011, 9:11:33 PM10/17/11
to rubyonra...@googlegroups.com
Why not just something like this? Then you can put your dojo.js in assets/javascripts and compile it like normal. Seems kind of unnecessary to add extra logic to javascript_include_tag

<script type="text/javascript">
  if ( typeof(dojo) === "undefined" ) { 
    script = document.createElement('script');
    script.type = "text/javascript";
script.src = '<%= asset_path "dojo.js" %>';
document.getElementsByTagName('head')[0].appendChild(script);
  }
</script>

Karel

unread,
Oct 17, 2011, 10:46:45 PM10/17/11
to rubyonra...@googlegroups.com
Hi Tim,

That's what I'm doing and it works just fine.

Though the second <script> tag belongs to the first one and could be generated/linked to it.

It is just an idea that would make it cleaner and more self contained.

Tim Shaffer

unread,
Oct 18, 2011, 7:51:02 AM10/18/11
to rubyonra...@googlegroups.com
Gotcha. You could always create a helper for it.
Reply all
Reply to author
Forward
0 new messages