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.