DRY, Don’t Repeat Yourself, gehört zu den grundlegendensten Prinzipien in der Software-Entwicklung. Wenn man denselben Code an mehreren Stellen wiederholen müsste, packe ihn in ein Etwas (zum Beispiel in eine Funktion, eine Klasse, …) und setze das mehrfach ein. Entsprechend kann man in Ruby on Rails Partials in Views einsetzen, oder Concerns in Controllern. Das Routing ist da keine Ausnahme, auch hier kann man mit Concerns arbeiten.
Das ist beispielsweise dann hilfreich, wenn eine API mehrere Versionen parallel unterstützen soll. Die angebotenen Ressourcen sollen die gleichen bleiben, aber vielleicht mit unterschiedlichen Feldern oder in unterschiedlichen Datenformaten. Nehmen wir als Beispiel eine API, die den Katalog einer Bücherei mit mehreren Standorten abbildet:
# in config/routes.rb
resources :locations
resources :media
resources :users
Diese API soll als v1 verfügbar bleiben, während gleichzeitig eine überarbeitete Version als v2 verfügbar ist. Dazu kann man beide Versionen in je einen Namensraum verpacken:
# in config/routes.rb
namespace :v1 do
resources :locations
resources :media
resources :users
end
namespace :v2 do
resources :locations
resources :media
resources :users
end
Dazu muss man mindestens auch die Controller in Unterverzeichnisse in app/controllers setzen, sowie die Controller-Klassen in Module namens V1bzw. V2, aber das wäre ein Thema für einen anderen Blogbeitrag. Hier soll es um DRY im Routing gehen.
Denn die Dopplung, die Ressourcen in beiden Namespaces aufzuzählen, lässt sich leicht auflösen, mit Hilfe eines concern:
concern :api do
resources :locations
resources :media
resources :users
end
namespace :v1 do
concerns :api
end
namespace :v2 do
concerns :api
end
Und schon ist die API auch an dieser Stelle ein Stück mehr DRY.