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. If someone could possibly point me in the right direction, I would really appreciate it....I will try to explain my understanding of how routes work. 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
Hello Steven,> [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?The two hashes are not the same because of "action" => "download" key/value pair. I guess you have to modify opts. Hope it helps, -- Jean-Fran?ois. -- ? la renverse.
Thanks! I''ve been staring at the computer screen way too long! :-P However, hah, when I change "opts" I get: def test_route url = "/all/#{sname}/#{vname}/#{platform_name}/download/5" opts = {:controller => ''user/version'', :platform_filter => "all", :software => sname, :version => vname, :platform => platform_name, :action => "download", :distribution_channel => "download", :id => 5} assert_recognizes(opts, url) end [ERROR]: The recognized options <{"software"=>"matlab", "platform"=>"windows", "action"=>"download", "platform_filter"=>"all", "id"=>"5", "controller"=>"user/version", "version"=>"r2006a", "distribution_channel"=>"download"}> did not match <{"software"=>"matlab", "platform"=>"windows", "platform_filter"=>"all", "action"=>"download", "id"=>5, "controller"=>"user/version", "version"=>"r2006a", "distribution_channel"=>"download"}> Jean-Fran?ois wrote:> Hello Steven, > >> [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? > > The two hashes are not the same because of "action" => "download" > key/value pair. I guess you have to modify opts. > > Hope it helps, > > -- Jean-Fran?ois. > > ------------------------------------------------------------------------ > > _______________________________________________ > Rails mailing list > Rails@lists.rubyonrails.org > http://lists.rubyonrails.org/mailman/listinfo/rails >
Hello again Steven,> I''ve been staring at the computer screen way too long! :-PYes, a pause for the eyes in not bad...> However, hah, when I change "opts" I get: > > def test_route > url = "/all/#{sname}/#{vname}/#{platform_name}/download/5" > opts = {:controller => ''user/version'', :platform_filter => "all", > :software => sname, > :version => vname, :platform => platform_name, :action => > "download", > :distribution_channel => "download", :id => 5} > > assert_recognizes(opts, url) > endBecause 5 is different from "5" ! -- Jean-Fran?ois. -- ? la renverse.
Even if I change it to a string the error is still occurs: def test_route url = "/all/matlab/r2006a/windows/download/5" opts = {:controller => ''user/version'', :platform_filter => "all", :software => "matlab", :version => "r2006a", :platform => "windows", :action => "download", :distribution_channel => "download", :id => "5"} assert_recognizes(opts, url) end [ERROR]: The recognized options <{"software"=>"matlab", "platform"=>"windows", "action"=>"download", "platform_filter"=>"all", "id"=>"5", "controller"=>"user/version", "version"=>"r2006a", "distribution_channel"=>"download"}> did not match <{"platform"=>"windows", "action"=>"download", "platform_filter"=>"all", "id"=>"5", "controller"=>"user/version", "distribution_channel"=>"download"}> @michael_daines No that''s just a typo :-( The actual platform regex is /windows|linux/ As far as the "ltform_filter" That was the emotions feature in my email client striping off the :p from :platform_filter. -Steven Jean-Fran?ois wrote:> Hello again Steven, > >> I''ve been staring at the computer screen way too long! :-P > > Yes, a pause for the eyes in not bad... > >> However, hah, when I change "opts" I get: >> >> def test_route >> url = "/all/#{sname}/#{vname}/#{platform_name}/download/5" >> opts = {:controller => ''user/version'', :platform_filter => "all", >> :software => sname, >> :version => vname, :platform => platform_name, :action => >> "download", >> :distribution_channel => "download", :id => 5} >> >> assert_recognizes(opts, url) >> end > > Because 5 is different from "5" ! > > -- Jean-Fran?ois. > > ------------------------------------------------------------------------ > > _______________________________________________ > Rails mailing list > Rails@lists.rubyonrails.org > http://lists.rubyonrails.org/mailman/listinfo/rails >
2006/5/19, Steven Hansen <runner@berkeley.edu>:> > Even if I change it to a string the error is still occurs: > > def test_route > url = "/all/matlab/r2006a/windows/download/5" > opts = {:controller => ''user/version'', :platform_filter => "all", > :software => "matlab", :version => "r2006a", > :platform => "windows", :action => "download", > :distribution_channel => "download", :id => "5"} > > assert_recognizes(opts, url) > end > > [ERROR]: > The recognized options <{"software"=>"matlab", > "platform"=>"windows", > "action"=>"download", > "platform_filter"=>"all", > "id"=>"5", > "controller"=>"user/version", > "version"=>"r2006a", > "distribution_channel"=>"download"}> did not match <{"platform"=>"windows", > "action"=>"download", > "platform_filter"=>"all", > "id"=>"5", > "controller"=>"user/version", > "distribution_channel"=>"download"}>Can you post your download route again, is the :software line missing ? -- Jean-Fran?ois. -- ? la renverse.
Ok I finally got the test to pass. I think what was throwing me was that I had :id => 5 when it should have been :id => "5" Then I kept frantically changing the keys and not realize that there literally wasn''t a match. def test_download_via_get_before_authentication() url = "/all/matlab/r2006a/windows/download/5" opts = {:controller => "user/version", :platform_filter => "all", :software => "matlab", :version => "r2006a", :platform => "windows", :distribution_channel => "download", :action => ''download'', :id => "5"} assert_recognizes(opts, url) end [OUTPUT]: 2 tests, 3 assertions, 0 failures, 0 errors I do have a question though, do the hashes that I pass via the "opts" argument have to include the total sum of the keys in my route? if my route is: map.download '':platform_filter/:software/:version/:platform/:distribution_channel/:id'', :controller => ''user/version'', :platform_filter => /all/, :platform => /windows/, :distribution_channel => /download/, :action => ''download'', :id => /\d+/ I can''t just pass in {:platform_filter, :software, :version, :platform, :distribution_channel, :id} like I can with redirect_to() or url_for() ? I would also need to include the :controller and :action ? I guess the answer is yes since my test is now passing, but to me this seem a bit unintuitive. Anyway, thanks to everyone for the help and patience. -Steven Jean-Fran?ois wrote:> 2006/5/19, Steven Hansen <runner@berkeley.edu>: >> >> Even if I change it to a string the error is still occurs: >> >> def test_route >> url = "/all/matlab/r2006a/windows/download/5" >> opts = {:controller => ''user/version'', :platform_filter => "all", >> :software => "matlab", :version => "r2006a", >> :platform => "windows", :action => "download", >> :distribution_channel => "download", :id => "5"} >> >> assert_recognizes(opts, url) >> end >> >> [ERROR]: >> The recognized options <{"software"=>"matlab", >> "platform"=>"windows", >> "action"=>"download", >> "platform_filter"=>"all", >> "id"=>"5", >> "controller"=>"user/version", >> "version"=>"r2006a", >> "distribution_channel"=>"download"}> did not match >> <{"platform"=>"windows", >> "action"=>"download", >> "platform_filter"=>"all", >> "id"=>"5", >> "controller"=>"user/version", >> "distribution_channel"=>"download"}> > > Can you post your download route again, is the :software line > missing ? > > -- Jean-Fran?ois. > > ------------------------------------------------------------------------ > > _______________________________________________ > Rails mailing list > Rails@lists.rubyonrails.org > http://lists.rubyonrails.org/mailman/listinfo/rails >