RepoJournal

$ cat rails/week/2026-09-28.log

Rails

Rails

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+.

60 commits 42 PRs merged 7 briefings covered

all rails reviews →

Remove support for dynamic controller/action in routes rails/rails

by tenderlove

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

by federico-carrocera

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

by Akash Saini

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

by Hartley McGuire

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

by carlosdanielpohlod

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

by pauljccode

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

by hmcguire-shopify

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

by carlosdanielpohlod

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.

or

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.

all rails reviews →