I think part of the problem is the MVC approach taken by Rails. While it does allow for a relatively clean abstraction, it is "controller-driven". This works well enough when all the logic is handled by *a single controller*. Wicket (Java) and Lift (Scala), on the other hand, follow a view-driven approach. I'm just diving into Lift, but the approach seems promising: It may work better for me. Or it may not. At the very least, it's another approach to the same problem.