I reimplemented my application pretty quickly with Sinatra. Sinatra is light and simple - you can even read and make sense of the source. Things went quickly and I started having fun again. How nice.
I also removed another pattern that I had inherited from Rails. Rails likes "model objects" that have instance variables and accessor methods for fields, and Rails takes whatever the original data was - usually relational data - uses it to fluff up model objects and then throws the relational data away. In the other direction, it takes field values from the objects and reconstructs data for the database. Many programmers think of their objects as being the "true data" and the database is only there for the purpose of storing their objects for the unfortunate case where the server crashes. This leads to the object-to-xxx-mapping category of software. I prefer the opposite view where the data in the database (or other back-end) is the "true data", and the application's job is just to manipulate the data, not define it. So I changed my application to keep the original "back-end" data all the way through the program. My "back-end" data is JSON-LD, and instead of converting it to objects, I just wrap the JSON-LD in objects that provide some helpful methods for reading and writing the JSON-LD. I don't keep the JSON-LD in string format - I convert it to hashes, arrays, strings and numbers, but the representation is faithful. No more Object-to-XXX-mapping.