Translation is a good way to force yourself understand the thing you want to know. Here is a great explanation of how routing works from "The Rails Way", well worth a translation.

What Happened to :id?Note that in that last example, we defaulted on :controller but we had to provide a value for :id. That’s because of the way defaults work in the url_for method. What happens is that the route generator marches along the template segments, from left to right—in the default case like this::controller/:action/:idAnd it fills in the fields based on the parameters from the current request until it hits one where you’ve provided a value::controller/:action/:iddefault! provided!When it hits one that you’ve provided, it checks to see whether what you’ve provided is the default it would have used anyway. Since we’re using a show template as our example, and the link is to an edit action, we’re not using the default value for :action.Once it hits a non-default value, url_for stops using defaults entirely. It figures that once you’ve branched away from the defaults, you want to keep branching. So the nondefault field and all fields to its right cease to fall back on the current request for default values.That’s why there’s a specific value for :id, even though it may well be the same as the params[:id] value left over from the previous request.Pop quiz: What would happen if you switched the default route to this?map.connect ‘:controller/:id/:action’And then you did this in the show.rhtml template:<%= link_to "Edit this auction", :action => "edit" %>Answer: Since :id is no longer to the right of :action, but to its left, the generator would happily fill in both :controller and :id from their values in the current request. It would then use "edit" in the :action field, since we’ve hard-coded that. There’s nothing to the right of :action, so at that point everything’s done.