Screencast: Routes in Rails 3

In Rails 3 wurde das Routing angepasst und in mancher Hinsicht vereinfacht. Ryan zeigt in dieser Woche wie bestehende Routen auf das neue Schema angepasst werden können, und was die neuen Features sind.

 

Download:

Download (30.2 MB, 13:31)
Alternativer Download für iPod & Apple TV (19 MB, 13:31)

 

Resourcen:

 

Quellcode:

[bash]
rails detour
mate detour
rails g controller info about
rails s
[/bash]

[ruby]
Detour::Application.routes.draw do |map|
# map.resources :products, :member => { :detailed => :get }
resources :products do
get :detailed, :on => :member
end

# map.resources :forums, :collection => { :sortable => :get, :sort => :put } do |forums|
# forums.resources :topics
# end
resources :forums do
collection do
get :sortable
put :sort
end
resources :topics
end

# map.root :controller => "home", :action => "index"
root :to => "home#index"

# map.about "/about", :controller => "info", :action => "about"
match "/about(.:format)" => "info#about", :as => :about

match "/:year(/:month(/:day))" => "info#about", :constraints => { :year => /d{4}/, :month => /d{2}/, :day => /d{2}/ }

match "/secret" => "info#about", :constraints => { :user_agent => /Firefox/ }

constraints :host => /localhost/ do
match "/secret" => "info#about"
end

match "/hello" => proc { |env| [200, {}, "Hello Rack!"] }
end
[/ruby]

[html]
<!– info/about.html.erb –>
<%= debug params %>
[/html]

Routes in Rails 3

Rails 3 ist bekanntermaßen eine Verschmelzung von Rails und Merb. Viele Anpassungen werden auch „nach Aussen sichtbar“ sein, aber die meisten Veränderungen werden im Rails-Kern stattfinden. In Rails 3 wird auch das Routing angepasst bzw. (wieder) neu geschrieben. Die Routen wurden in der Vergangheit häufiger angepasst und mit jeder Version wurden sie schneller und brachten mehr Flexibilität. Auch die neue Version macht keine Ausnahme und bringt mit der neuen DSL ein paar Verbesserungen mit.

Die neue DSL ist insgesamt sauberer aufgebaut. Eine typische RESTful Route in Rails 3 könnte folgendermaßen Aussehen:

[ruby]
resources :products do
resource :category

member do
post :short
end

collection do
get :long
end
end
[/ruby]

So würde die es z.Z. in Rails 2 aussehen:

[ruby]
map.resources :products, :member =&gt; {:short =&gt; :post}, :collection =&gt; {:long =&gt; :get} do |products|
products.resource :category
end
[/ruby]

Wie man sieht ist die neue Schreibform viel lesbarer und somit einfacher zu pflegen.

Im folgenden werden wir verschiedene Beispiele für die unterschiedlichen Route-Typen  in Rails 3 zeigen

 

Default Route

Die Default Route in Rails 3 ist nun explizieter und die Klammern verdeutlichen die optionalen Parameter:

[ruby]
match ‚/:controller(/:action(/:id))‘
[/ruby]

Reguläre Routen

Anstatt verschiedene Parameter anzugeben, kann man nun die Angaben „zusammenfassen“ ("catalog#view„):

[ruby]
match ‚products/:id‘ =&gt; ‚catalog#view‘
[/ruby]

Das Vereinfacht die Routenerstellung. Die Beispielroute wie sie heute geschrieben werden würde:

[ruby]
map.connect ‚products/:id‘, :controller =&gt; ‚catalog‘, :action =&gt; ‚view‘
[/ruby]

Named Routen

Die Unterscheidung zwischen regulären und named Routen ist schwieriger im Vergleich zu Rails 2. Der einzige Unterschied ist, dass bei regulären Routen im ersten Argument ein Parameter zu finden ist.

[ruby]
match ‚logout‘, :to =&gt; ’sessions#destroy‘
[/ruby]

Auch in diesem Fall ist die neue Version sauberer und lesbarer als in Rails 2:
[ruby]
map.logout ‚/logout‘, :controller =&gt; ’sessions‘, :action =&gt; ‚destroy‘
[/ruby]

Leere Route

Die Startseite einer Rails-App wird durch eine „leere“ Route konfiguriert. Bereits in der jetzigen Form gibt eine Kurzschreibform dafür:

[ruby]
map.root :controller =&gt; "welcome", :action =&gt; ’show‘
[/ruby]

Dies wird nochmal mehr vereinfacht und kann folgendermaßen geschrieben werden:

[ruby]
root :to =&gt; ‚welcome#show‘
[/ruby]

RESTful Routen

RESTful Routen ist die default- und bevorzugte Variante seit Rails 2.

Eine typische RESTful Route wird noch einfacher zu konfigurieren sein:

[ruby]
resources :products
[/ruby]

Diese Zeile würde alle benötigten Routen generieren. Genau wie in der jetzigen Version lassen sich mehrere Routen in einer Zeile definieren.

 

Weitere RESTful Actions

Weitere RESTful Actions lassen sich auf verschiedene Art und Weise implementieren:

[ruby]
resources :products do
collection do
get :sold
post :on_offer
end
end
[/ruby]

Die Action läßt sich auch folgendermaßen schreiben:

[ruby]
resources :products do
get :sold, :on =&gt; :collection
end
[/ruby]

Die erste Variante ist besser wenn mehr als eine Action konfiguriert werden muss.

 

Nested Resources

In Rails 2 wurden nested Resources in einem Block definiert oder durch die Verwendung von :has_many oder :has_one Schlüssel.

Beide Version werden nun durch die Blockversion ersetzt:

[ruby]
resources :projects do
resources :tasks, :people
end
[/ruby]

Namespaced Resources

Diese sind nützlich wenn Resoucen in einem (Unter-)Verzeichnis liegen und sie lassen sich einfach konfigurieren:

[ruby]
namespace :admin do
resources :projects
end
[/ruby]

Die Neugestaltung der Routes in Rails 3 sieht viel versprechend aus und wird mit großer Sicherheit die Arbeit vereinfachen. Wir hoffen dieser Artikel wird euch beim Umstieg helfen.

 

Dieser Beitrag ist angelehnt an den Blogeintrag von Rizwan Reza