Nick Sutterer revisits the Reform gem's design mistakes and walks through the Reform 3 redesign: same declarative DSL, but a runtime API based on immutable objects and class methods (present/validate/persist) instead of one mutable form instance. The rewrite is built on Trailblazer activities, benefits from its tracing and step DSL, makes strong_parameters obsolete, and supports dry-validation and ROM. Ends with Q&A on parsing-vs-validation cycles, monads, and what he'd do differently.
claude-opus-4-742ee18ac