Pour répondre à votre confusion avec la métaphore (bien que la réponse ait été donnée en d'autres termes dans votre question) :
Groovy est à Grails ce que Ruby est à Ruby on Rails, mais qu'est-ce que cela signifie ?
Grails était un framework web construit sur/avec le langage de programmation Groovy pour faire la même chose pour Groovy que Rails (un framework web pour Ruby) fait pour Ruby.
Que signifie être "sur les rails" ?
La réponse à cette question se résume à l'essence même de ces frameworks web.
Ces frameworks web (Grails et Rails) sont construits sur le principe de "la convention plutôt que la configuration", ce qui signifie que l'utilisation de conventions communes pour développer des applications web peut conduire à une meilleure productivité et à des applications plus faciles à maintenir (ceci est une généralisation grossière). En définissant une convention et en vous y tenant, vous constaterez que vos applications sont faciles à générer et rapides à mettre en œuvre.
C'est ce que cela signifie pour moi d'être "sur les rails", comme un train. Lorsqu'une nouvelle ligne de train est développée, il n'est pas nécessaire de réinventer la façon dont le train se rendra d'un endroit à un autre, car une seule convention a permis de résoudre ce problème depuis des décennies : les rails. De la même manière que les rails d'une ligne de train limitent son trajet entre deux endroits, les cadres Web basés sur des conventions utilisent ces dernières pour offrir une plus grande flexibilité aux développeurs d'applications, afin qu'ils puissent se concentrer sur le problème essentiel de leur application.
L'un des principaux avantages d'une convention pour un framework web est que ce dernier peut désormais faire des suppositions sur la manière dont certaines couches de l'application s'assemblent. Dans Rails, on peut généralement supposer que si une table de base de données a un nom pluriel, la classe ActiveRecord mappée à cette table aura le nom singulier correspondant. Par conséquent, les générateurs de code Rails peuvent utiliser les informations de mappage des données pour générer du code d'accès aux données, comme les chercheurs dynamiques, les migrations, les traversées d'association paresseuses, etc. Ce code d'accès aux données dans un cadre basé sur la configuration est laborieux à coder à la main.