Year Fourteen with Rails

This last year saw the launch of RailsWorld in Amsterdam celebrating 20 years of Rails, while RailsConf on the other hand is being wound down. Honeypot released a documentary on Rails’ origins. Rails 7.1 shipped with default Dockerfiles. Ruby 3.3 shipped with Prism and RJIT and a Bun 1.0 Javascript runtime was released.

At my employer we upgraded our database hardware and software, enabling more data model refactoring and simplification. react-rails and Webpacker were removed from our web stack as we made increased use of Turbo. Microsoft/Github Copilot has become an everyday pair programmer with suggestions ranging from sublime to clueless to beguilingly incorrect. The result has been more code comments and tests, both as LLM input and output, and a bump in productivity accepting suggestions ranging from insightful to good enough. SolarWinds Librato was replaced by AWS CloudWatch.

On the open source side I released activeadmin-rails v1.7 but made little effort to market it as my attention has been elsewhere. paypal-sdk-subscriptions reached 130,000 downloads.


Ten years ago I was a relatively inexperienced Rails consultant hired to accelerate custom development at a rapidly growing e-commerce startup.  A major overhaul was desired for the backend systems using an extensive RDBMS schema and I wanted feedback with a rapid prototype, so I reached for a framework presented at 2011 RailsConf called ActiveAdmin.

Ultimately the overhaul was a success and I was hired to manage maintenance, where I have dug into ActiveAdmin’s features to learn customization, and shared what I learned on the wiki and StackOverflow.  The primary author, Greg Bell, moved on to grander things long ago but others, briefly including myself, stepped up to continue maintenance of the gem from Rails 3 through the present.

In some ways ActiveAdmin in 2011 was ahead of its time, the UI built from the ground up using HTML views in Ruby extracted as Arbre (similar to Markaby, Erector, Fortitude and now Phlex).  For better or worse this approach  failed to make in-roads against Erubi and Haml/Slim templates, then a few years ago ES6 revitalized front-end development and gave rise to React, threatening to delegate Rails to an API only framework.  Fortunately Rails has now evolved with Hotwire and Stimulus, and GitHub has pioneered a new Rails compatible framework called ViewComponent.

In other ways ActiveAdmin in 2011 was a product of its time, leaning heavily on Ruby meta-programming to build an extensive configuration DSL.  While impressive in some respects it also adds to the learning curve for both advanced customization and trouble shooting.  Since then mainstream Ruby development has swung back to a more object oriented approach emphasizing inheritance and composition: Administrate exemplified this trend and was a real eye opener to me when it was announced.

Where does that leave ActiveAdmin in 2023?  Many have already moved on to the likes of react-admin, but in my opinion Rails 7 is time for a significant overhaul, and this fork is my effort to offer an alternative with a clear migration path.

Year Thirteen with Rails

These last twelve months have been the first without a major or minor Rails release, though there have been multiple bug-fix patches to 7.0. Ruby 3.2 included production ready YJIT and better ReDoS protection. InfoWorld published ‘Whatever happened to Ruby?’ However, the biggest buzz has been figuring out how to use ChatGPT productively: a much easier task with greenfield projects I think.

At my employer the focus has been on Google Ads, fraud detection and logistics improvements.
Nonetheless ‘maintenance mode’ still includes an unending flow of diverse fixes and refinements such as unearthing race conditions and fixing transaction boundaries. 3DS v1 was sunset, AWS abandoned Data Pipeline, and we explored Terraform. Apollo GraphQL has been retired as REST based alternatives are holding up good enough.

New gems used this year included `validates_email_format_of` and integrations with Braintree and AfterShip.

On StackOverflow I drifted into the ‘activeadmin’ tag top 15

For better or worse my only open source contributions have been to my own evolving fork of ActiveAdmin: using a different rendering strategy for Arbre, embracing Rails layouts, slashing controller meta-programming, and reducing dependency on the resource DSL.

Year Twelve with Rails

This last year has seen the release of Ruby 3.1 and Rails 7.0 with its exclusive use of Zeitwerk and shift away from Node and Webpacker to Hotwire. React, Webpacker, Yarn and Jest are still used widely with Rails but Stimulus adoption has been significant.

At my employer European PSD2 has continued to require significant attention with a rewrite of Redsys payment integration using REST and the addition of Cardinal Cruise. We have also refined shipping method selection and handling of stock-outs.

New gems used this year included Gala for ApplePay. Open source contributions included replacing the Resque web-runner by merging the abandoned Vegas gem.

Year Eleven with Rails

Five years after our adoption of React on Rails this year has seen the release of Stimulus-Reflex and the refinement and extension of Turbolinks and Stimulus into Hotwire, a welcome, mostly server side alternative.  So far we have only explored Frames for faster TTFB but we’re optimistic about wider applications.  Also notable this year Rails 6.1 shipped with built in support for ViewComponents, though we are yet to complete our upgrade or move from Ruby 2.7 to 3.0.
At my employer our modular monolith architecture remains unchanged. Interestingly Shopify published a nuanced engineering article concluding “all large architecture changes end up in an incomplete state”.  Apart from European PSD2 mandates, a new billing strategy and greater Facebook marketing API integration, our focus has been on improved change logging and auditing, and tidying and extending test data factories, VCR cassettes, interactor, job, request and feature  specs.  Along the way we refactored offer management, logistics exports, PayPal Express Checkout and fraud detection.  For the first time this year no new gem dependencies were introduced, though we forked PayPal’s REST SDK, abandoned by PayPal.
After years answering 160+ ActiveAdmin questions on StackOverflow I reached the top 20 contributor list and earned StackOverflow’s ‘activeadmin’ badge… time to retire, I think.

Year Ten With Rails

This year marks for me one decade working with Ruby (and Rails), barely surpassing my time with Java, and still not matching my many years with C/C++. I’ve worked with a dozen languages and ecosystems, including Python and JavaScript, but Ruby remains my preference for customized business solutions, though alas it may never displace Spring or even ASP.NET as I once hoped.
At my employer we’ve completed our third major Rails upgrade, to 6.0.  As before this has involved upgrading dozens of dependencies: Ruby 2.6, Node 10, Webpacker 4.2 and Babel 7.9 for JavaScript (now a default, though we adopted it a while ago), SassC (Ruby version discontinued), Sprockets 4, Haml 5, GraphQL 1.9, RSpec-Rails 4 and Capybara 3.  Rails 6 introduced Zeitwerk (mostly positive), Parallel Test (Minitest only) and multi-database support (for scaling production). ActiveRecord included various changes and deprecations and we’ve overhauled all our validation syntax and switched to foreign keys required by default.
Beyond the upgrade our system’s architecture has remained stable as we slowly add more integrations: new gems (to me) used this year included ferrum (for testing PayPal) and facebookbusiness. I also published paypal-sdk-subscriptions (with contributions) and activemerchant-flexpay.  iContact reimplemented their API following a divestiture to j2 resulting in various small revisions to pocus. I’ve made no new contributions to ActiveAdmin apart from some StackOverflow answers, but I did finish the merge of Polyamorous and provide a stop-gap fix to Ransack with Rails 6.0.1. Formtastic became another ActiveAdmin dependency transitioned from the original author after falling into neglect.

PayPal Subscription Management Ruby SDK

PayPal’s APIs are… a work in progress. First came Direct Payments, aka. PayPal Payments, aka. payments v1 accompanied by a REST SDK that provides API client code in various languages. After the Braintree acquisition came PayPal Checkout with a new payments API (v2) and completely new Checkout SDK. The Direct Payments API has continued to evolve, however, (despite being “in the process of being deprecated”) with a new Product Catalog and Subscriptions implementation replacing the original Billing Agreement. Unfortunately as of writing these API changes were not being reflected in the REST SDK, though there is now a separate subscriptions developer reference home page that explains how to customize the JS SDK and documents the server side API (for the most part, but Plan Create and Subscription Create are missing(!), for that see the REST API reference). PayPal’s documentation catalog links to the REST SDK for subscriptions management despite the implementation being absent.

For better or worse Braintree has taken a very different approach with the Checkout SDK compared to the REST SDK: there is no longer any effort to provide mapping of the schema to data objects with marshalling or unmarshalling. The open source gem code is machine generated using a tool and the underlying schema representation is not obviously available, making collaboration on any improvements problematic if not impossible.

To be fair the REST SDK is dated and has it’s own issues: no client side validation or defaults, unintuitive connection management and limited control of logging, but at least these things can be fixed. Unfortunately it appears unlikely.

For further discussion see PayPal-Ruby-SDK#378

Nine Years A Rubyist

This last year has seen continuing maturation of Ruby on Rails with Ruby 2.6 and Rails 6.0. Ruby 2.6 included an initial release of JIT compilation for YARV, and Rails 6.0 adopts Webpacker as the default JavaScript asset manager instead of Sprockets. Ruby, however, continues increasingly overshadowed by JavaScript and Python, and Rails is challenged by the popularity of microservices and Node. Neither Matz’s mruby 2.0 nor Crystal have gained widespread attention, but at least AWS Lambda Ruby support and FaastRuby are now available.

At a practical level, for our mature in-house codebase a switch to microservices is not necessary or cost effective. This year, however, has seen Stephan Hagemann’s ‘Component Based Rails Applications’ ebook published (endorsed) as a softback by Addison Wesley and a very similar approach embraced by Shopify. Our own internal codebase remains ~60% gemified from 2017 in a simple layered architecture while we have focused on consistently packaging business logic using interactors (service objects) for both foreground and background processes.

New gems (to us) used this year included roxml, and replacing the unmaintained god process monitor with eye. On the open source side I stepped back from contributing to ActiveAdmin and published instead a couple of API clients for AmEx and PayPal.

Eight Years A Rubyist

Year 8 with Rails for me has been an unglamorous affair of maintenance upgrades (Ruby 2.3, Rails 5.x), refactors and bug fixes.

It has been discouraging to see StackOverflow characterize Ruby as shrinking and unpopular and compare Ruby on Rails with Nate Berkopec’s findings that vanilla Rails apps are perfectly capable of 1,000 requests/minute is cold comfort in the face of shrinking developer mindshare: this decline has real consequences in terms of open source contributions and Ruby gem maintenance.

On the other hand Ruby remains #4 on Github and developers are still very much in demand. JavaScript continues ascendant but Derek Prior of Thoughtbot has mentioned cooling enthusiasm for Elixir, and Go too has slid in popularity, at least according to TIOBE. Crystal 1.0 remains delayed. An experimental JIT has now shipped for YARV foreshadowing further performance improvements in Ruby 2.6.

On the Rails front end Basecamp continued their contrarian tradition by offering Stimulus.js as a more limited and pragmatic alternative to React’s dominant framework. The Majestic Monolith remains relevant for smaller businesses and early stage startups despite ambitious engineers everywhere (myself included) wanting to use the same tech stack as the largest, most successful companies from Apple, Salesforce and Netflix to… Twitter. At Railsconf GitHub, now owned my Microsoft, recommitted to easier scalability enhancements for Rails 6.

On the infrastructure side the Docker ecosystem has continued to mature with the embrace of Kubenetes at Dockercon EU in Oct ’17. It has also been good to see a more enlightened approach to open source by AWS with EKS and ApacheMQ.

At my employer we continue to support a somewhat modular monolith with a 50 kloc monorepo, 40 ActiveAdmin resources, 60 background jobs, 70 direct and 240 total gem dependencies. We have fully caught up with Rails 5.2 and edged forward with Ruby 2.3 for Bootsnap support and React-Apollo 1.x. Procedural code has continued to migrate to standardized Interactors. New gems used included Bootsnap, Combustion, Dalli (memcached) and AWS SDK v3 SQS, S3, SES & SNS.

What has Rails 5.x brought us? More secure controller parameters, still scarily subvertible by less experienced developers, but at least awareness has been raised. More restricted autoloading, for the best. Better callback management, though we try to avoid them as much as possible. Bootsnap with a significant improvement in startup times, yay!

Open source contributions this year have included a couple of minor ActiveAdmin releases including Rails 5.2 support and various PRs for the AuthorizeNet Ruby SDK.

AWS features I have been working more with this year have included ClassicLink, private subnets, piculet, Data Pipeline and managed SSL certs. Concerns over production container management have been mitigated with a mass of metrics collection with CloudWatch, Librato and Skylight.

What will the next year bring? A pragmatically managed evolution towards ‘mini-services’, Rails 6 with polished multi-database support, Ruby 2.6 with improving JIT support, Webpack as the default JavaScript handler and increasing adoption of Kubernetes.


Spreedly’s first customer and partner conference was held in leafy Durham this year. First thing you notice is the new construction and the recovering economy: the city is still far from overdeveloped. The one-and-a-half day event drew more than one hundred attendees in the Carolina Theatre downtown. Spreedly’s growth has been accelerating since it pivoted away from hosted subscriptions a few years ago into a meta-gateway providing PCI compliant card vaulting and a standardized card payments API. Transaction volume last year tripled to around 90M, helped by key accounts like FattMerchant and SeatGeek, which recently won the ticketing business for the Dallas Cowboys. The first day featured lightening talks on feature prioritization, Riak, Elixir and Kafka, followed by open house at Spreedly’s offices, recently doubled to around 10,000sq.ft.

The second day was filled with a variety of presentations. Nate Talbott pitching to build a payments community. John Duff with a familiar history of payments at Shopify: integrations using active_merchant, compliance, scalability, partnering with Stripe for merchant services, leveraging data for fraud protection. Jennifer Marston on transitioning to Spreedly at Paylock. Nathan Adamson on the costs of EMV for small businesses. Stephanie Slattery on accessibility and Alex Henderson on ‘assured’ payments and learning to effectively work around gateway outages. Camille Acey providing a non-engineering perspective and Brad Powers of Passport on the challenges and benefits of working on local government projects. Unfortunately I had to skip Sandi Metz’s closing keynote but I look forward to catching it on Confreaks.

Posts navigation

1 2 3 4 11 12 13
Scroll to top