I love the routes feature for RoR...until now. I''m trying to write
tests
to make sure my urls are correctly mapping to the routes I expect them
to map to. This is driving me nuts because I simply can''t get any of my
tests to pass. I have thus concluded that routes must work differently
than I thought. I will try to explain my understanding of how routes
work. Via this process, it would be great if someone could point out
where I''ve gone wrong.
Here is my route:
[code]
map.download
''latform_filter/:software/:version/latform/:distribution_channel/:id'',
:controller => ''user/version'',
latform_filter => /all/,
latform => /windows/linux/,
:distribution_channel => /download/,
:action => ''download'',
:id => /\d+/
[/code]
Ok, so the following url will map to this route:
http://mysite.com:3000/all/eudora/7.0.1/windows/download/5
Here''s how I think the match is determined:
1. Rails looks at the first portion of the url--"all"--and checks
to
see if it will be accepted by my route. It matches my regex constraint,
so platform_filter => "all" is set.
2. Rails inspects the next url item--"eudora"--checks to see if it
matches my mapping constraint. There is no constraint, so it matches,
sets :software => "eudora".
3. Rails inspects the next url item--"7.0.1"--checks to see if it
matches my mapping constraint. There is no constraint, so :version =>
"7.0.1" is set.
4. Rails inspects the next url item--"windows"--checks to see if it
matches my mapping constraint. It matches my regex constraint, so
platform => "windows" is set.
5. Rails inspects the next url item--"download"--checks to see if
it
matches my mapping constraint. It matches my regex constraint, so
:distribution_channel => "download" is set.
6. Rails inspects the last url item--"5"--checks to see if it
matches
my mapping constraint. It matches my regex constraint, so :id =>
"download" is set.
7. All the url portions mapped, so this route will be used.
8. Rails looks at the :controller and the :action defined in this
route and executes them, passing all the matchig url portions via the
params hash. Ex: we can access the :software portion of the url like
this--params[:software]
If any of the above steps do not match, the route is skipped, the keys
are cleared and the process is repeated with the next route.
So now I want to test my route with within the
User::VersionControllerTest class:
[code]
def test_route
url = "/all/eudora/7.0.1/windows/download/5"
opts = {:controller => ''user/version'', latform_filter =>
"all",
:software => "eudora",
:version => "7.0.1", latform =>
"windows",
:distribution_channel => "download", :id => 5}
assert_recognizes(opts, url) # Assertion fails!
end
[/code]
I really don''t understand why this is failing, even the error message
doesn''t make sense:
[code]
The recognized options <{"software"=>"eudora",
"platform"=>"windows",
"action"=>"download",
"platform_filter"=>"all",
"id"=>"5",
"controller"=>"user/version",
"version"=>"7.0.1",
"distribution_channel"=>"download"}> did not match
<{"software"=>"eudora",
"platform"=>"windows",
"platform_filter"=>"all",
"id"=>5,
"controller"=>"user/version",
"version"=>"7.0.1",
"distribution_channel"=>"download"}>
[/code]
The error message show identical options but says they don''t match?
If anyone can shed some light on this, please do.
-Steven
--
Posted via http://www.ruby-forum.com/.