wrong url construction with edge rails under certain conditions

Hi! I've noticed the new behavior that was not seen in stable Rails. Using edge Rails (from today) I have the following problem.

Example situation:     * user is executing GET request to /sprint/show/205     * there's a route: map.connect 'sprint/show/:sprint', :controller => 'task', :action => 'index'     * in task/index.rhtml template we have: <%= link_to "Break Me", :action => 'foo', :params => { :sprint => 1 } %>

Problem:     * on generated page the link is: <a href="/task/foo">Break Me</a> without the sprint parameter

Why?     * url_for is used to build the URL     * url_for calls the URL rewriter (UrlRewriter::rewrite_path) to get the URL path string     * rewriter asks the request about path parameters and in our case it gets {:controller => 'task', :action => 'index', :sprint => 205 }     * rewriter asks the route to generate the url by passing path parameters as "recall" argument to Route::generate(options, recall, method)     * generate method "recalls" those from the path, including "sprint" which is wrong in this case!

The conclusion is that in edge Rails parameters to the url_for can not have the same name as symbols in the route. I'm not sure at this point if that's a bug or "feature" of new Rails. I can easily fix the situation just by using :params => {:sprint_id => 1} so maybe this issue is an another thing that should be in the upgrade guide...

Alexander,

Don't put things in :params => {}. Just do :sprint => 1 directly.

In other words:

   link_to "...", :action => "foo", :sprint => 1

- Jamis

Well, that doesn't quite work. I still have the url without the sprint parameter. I guess that's because :sprint is still passed in the recall option of Route::generate(options, recall, method)

Thanks!