$ cat rails/week/2026-09-28.log
the week in review · Sep 28 – Oct 4, 2026
Rails drops dynamic controller routes, rewrites JSON escaping
By RepoJournal · composed from the cited sources · human-reviewed weekly · methodology
Routes reading controller or action from the URL now raise ArgumentError, and JSON escaping moves to String#tr! on Ruby 3.4+.
Remove support for dynamic controller/action in routes rails/rails
Routes of the form get ":controller(/:action(/:id))" now raise an ArgumentError instead of warning. The removal closes a deprecation that has stood since Rails 5.0, so any app still matching controller and action out of the path has to be rewritten by hand.
Escape JSON with String#tr! rails/rails
The encoder now uses String#tr! with a Hash, which substitutes in a single pass over the UTF-8 string with no Regexp and no round-trip. tr! raises on invalid encodings, so the fast path is guarded on valid_encoding? and falls back to gsub!.
Include extra node state in Arel equality rails/rails
Arel::Nodes::Matches, Regexp, InfixOperation and UnaryOperation inherited eql? and hash from Binary/Unary, which compare only class and operands, so the escape, case-sensitivity and other state the subclasses add on top was ignored. Nodes that carry different state no longer compare equal.
Remove dead code for Ruby < 3.3.1 rails/rails
Compatibility branches for Ruby versions below 3.3.1, the floor set back in March, are gone. The test that went with them stays, since it validates the 3.3.1+ behavior still holds.
Don't assume a tagging logger keeps tags in its formatter rails/rails
TaggedLoggerProxy#tag checks logger.respond_to?(:tagged) and then reads logger.formatter.current_tags. Since BroadcastLogger#tagged was defined, that check no longer implies a formatter exists, and a BroadcastLogger over plain loggers has none, so wrapping one raised.
Preserve source encoding in the Prism workaround rails/bootsnap
When Encoding.default_internal is set, the Prism workaround could transcode source before compiling it; in Metasploit on Windows with Ruby 3.4.9 and Encoding::BINARY, valid UTF-8 source raised Encoding::UndefinedConversionError and the console would not start. Source encoding is now passed through untouched.
Fix IndexedRow lookups when columns aren't unique rails/rails
IndexedRow could build an indexes hash holding values larger than the row itself, because it recorded a column's last index against the real row, so lookups broke when columns were not unique. The fix keeps the two in step.
Treat `false` as disabled for `idle_timeout`, `reaping_frequency` and `max_age` rails/rails
HashConfig calls to_f/to_i on idle_timeout, reaping_frequency and max_age, so a boolean in database.yml raised NoMethodError on boot; YAML turns off/no into false and on/yes into true. Those values are now treated as disabled.
$ ls rails/week/ # the briefings behind this review
Keep up with Rails in about 3 minutes: what actually shipped — the commits, pull requests, releases, and security advisories that matter.
fair warning: these emails are deeply technical. diffs, version numbers, CVEs, benchmark deltas. if that's not your idea of a good read, this isn't your newsletter.
Folds into your digest — weekly by default, monthly if you prefer. Unsubscribe in one click.