Below is a version‑by‑version timeline of how Ruby on Rails has supported JavaScript, starting before 1.0 and running through today. For each milestone I list what changed, why it mattered, and where it came from.
Pre‑1.0 (2005)
- Mar 22, 2005 — Rails 0.11: Early Ajax support built on Prototype; Rails ships helpers that generate JS (e.g.,
link_to_remote,form_remote_tag). - Jun 23, 2005 — Ahead of Rails 0.13: Rails announces a “big upgrade” to Ajax with script.aculo.us (effects, drag‑and‑drop) layered on Prototype. (Rails)
- Jul 6, 2005 — Rails 0.13 released: Prototype + script.aculo.us are effectively “the” Rails JavaScript stack pre‑1.0. (scottstuff.net)
Rails 1.x
- Dec 13/15, 2005 — Rails 1.0: Prototype/script.aculo.us ship with Rails; view helpers like
javascript_include_tag(:defaults)include them; Ajax helpers (e.g.,link_to_remote) are standard practice. (apidock.com) - Mar 28, 2006 — Rails 1.1: RJS (Ruby‑generated JavaScript) lands: write Ruby in
.rjstemplates and Rails emits JS to update the page (replace HTML, visual effects, etc.). Huge step for Ajax ergonomics. (Rails)
Rails 2.x (2007–2009)
- Prototype/script.aculo.us remain the built‑ins; helpers such as
link_to_remote,observe_field, and Scriptaculous helpers are common (last seen in the 2.3 era docs). (apidock.com)
Rails 3.x: UJS and the Asset Pipeline
- Aug 2010 — Rails 3.0: Rails adopts Unobtrusive JavaScript (UJS). Instead of inline JS helpers, you mark links/forms with
data-remote="true"and arails.jsdriver handles Ajax. Legacy*_to_remotehelpers are removed. Works with Prototype or jQuery via adapter drivers. (simonecarletti.com) - Aug 2011 — Rails 3.1:
- Asset Pipeline (Sprockets) becomes the standard way to compile/package JS & CSS.
- jQuery becomes the default JS library (Prototype can still be used).
- CoffeeScript added to the default Gemfile for authoring client code and
.js.coffeeviews. - RJS is extracted from core. (Ruby on Rails Guides)
Rails 4.x: Turbolinks era
- Jun 2013 — Rails 4.0: Turbolinks ships by default to speed navigation by swapping the
<body>over Ajax. (This is the predecessor to today’s Turbo Drive.) (Ruby on Rails Guides)
Rails 5.x: Real‑time and modern tooling
- Jun 2016 — Rails 5.0: Action Cable integrates WebSockets end‑to‑end (server & JS client) for real‑time features. Turbolinks 5 also lands. (Ruby on Rails Guides)
- Apr/May 2017 — Rails 5.1: Rails embraces the JS toolchain: Yarn support and a Webpack(er) bridge; jQuery is no longer a default dependency; rails‑ujs (vanilla JS) replaces jquery‑ujs as the built‑in UJS driver. (Ruby on Rails Guides)
Rails 6.x: Webpacker by default
- Aug 2019 — Rails 6.0: Webpacker becomes the default way to manage JavaScript in new apps; Sprockets continues for assets like images/CSS (unless configured otherwise). (Rails)
Rails 7.x: Import maps + Hotwire
- Dec 15, 2021 — Rails 7.0: Rails pivots away from Webpacker by default and offers three official answers to JS:
- Import maps (no Node/bundler),
- jsbundling‑rails (esbuild/rollup/Webpack/Bun) when you do want a bundler, and
- Hotwire (Turbo + Stimulus) as the default interaction model. Sprockets becomes optional. UJS is no longer the go‑to; Turbo is the recommended path. (Rails)
- Oct 2023 — Rails 7.1: Continues the Rails‑7 approach; import maps + Turbo/Stimulus tooling mature (with minor UJS compatibility shims possible if you need them). (Ruby on Rails Guides)
- Feb 2024 — Turbo 8 (Hotwire): Major Turbo update introduces morphing page refreshes, view transitions, and InstantClick‑style preloading—affecting Rails front‑end behavior without custom SPA frameworks. (37signals Dev)
Rails 8.x (2024–2025)
- Rails 8.0: Rails keeps the Rails‑7 JavaScript posture (import maps by default; bundling via jsbundling‑rails when needed; Hotwire as the primary interactivity layer). Propshaft becomes the default asset pipeline, which affects how JS/CSS assets are served and digested. (Ruby on Rails Guides)
Key shifts at a glance
- 2005–2010: Prototype/script.aculo.us + Rails helpers/RJS (server‑generated JS).
- 2010–2016: UJS with data‑attributes; Asset Pipeline; jQuery default; Turbolinks for fast nav. (simonecarletti.com)
- 2016–2019: Action Cable (WebSockets). (Ruby on Rails Guides)
- 2019–2021: Webpacker default. (Rails)
- 2021→: Import maps (no Node), jsbundling‑rails (when you need bundling), and Hotwire (Turbo + Stimulus) as the preferred JS story; UJS deprecated in favor of Turbo. (Rails)
Sources / release notes & docs
- Rails blog & release notes for 1.1 (RJS) and 7.0 (new JS posture). (Rails)
- Working with JavaScript in Rails (current guide, including notes on UJS vs Turbo). (Ruby on Rails Guides)
- 3.1 release notes (Asset Pipeline, jQuery default) + CoffeeScript default via
coffee‑rails. (Ruby on Rails Guides) - 4.0 release notes (Turbolinks). (Ruby on Rails Guides)
- 5.0 release notes / Action Cable guide. (Ruby on Rails Guides)
- 5.1 release notes (Yarn/webpack; drop jQuery default; rails‑ujs). (Ruby on Rails Guides)
- 6.0 announcement (Webpacker by default). (Rails)
- Importmap‑rails and jsbundling‑rails gems. (GitHub)
- Turbo 8 announcement (morphing, transitions, InstantClick). (37signals Dev)
- Early history of Prototype/script.aculo.us in 0.11/0.13 (Thomas Fuchs’ deck & Rails blog).
Notes for maintainers upgrading legacy apps
- Prototype-era helpers → UJS: Replace
*_to_remotehelpers withremote: true(Rails 3+). (simonecarletti.com) - jQuery UJS → rails‑ujs: Rails 5.1 removed the jQuery dependency;
rails‑ujsis built in (but in Rails 7+ Hotwire/Turbo is recommended). (Ruby on Rails Guides) - Webpacker → Rails 7+: Migrate to import maps (no bundler) or jsbundling‑rails (esbuild/rollup/Webpack/Bun). (GitHub)
- Turbo 8 morphing: Be aware of how morphing interacts with Stimulus/controllers when upgrading. (37signals Dev)
If you want this as a one‑page poster or CSV with dates/links for each item, say the word and I’ll produce it immediately.