SitePoint Sponsor

User Tag List

Results 1 to 4 of 4
  1. #1
    SitePoint Enthusiast Stevenwulf's Avatar
    Join Date
    May 2002
    Location
    Berkeley
    Posts
    76
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Struggling with Routes

    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 ':platform_filter/:software/:version/:platform/:distribution_channel/:id',
        	:controller => 'user/version',
        	:platform_filter => /all/,
        	:platform =>  /windows/linux/,
        	:distribution_channel => /download/,
        	:action => 'download',
        	:id => /\d+/
    Ok, so the following url will map to this route:
    http://mysite.com:3000/all/eudora/7....ows/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', :platform_filter => "all", :software => "eudora", 
     			 :version => "7.0.1", :platform => "windows",
     			 :distribution_channel => "download", :id => 5}
        
       assert_recognizes(opts, url)	 # Assertion fails!
        end
    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"}>
    The error message show identical options but says they don't match?

    If anyone can shed some light on this, please do.

    -Steven

  2. #2
    Mal Reynolds Mandibal's Avatar
    Join Date
    Aug 2003
    Location
    Columbus
    Posts
    718
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Actually the two hashes do not match. There is an "action"=>"download" in the first hash that is not in your opts hash.
    Erh

  3. #3
    SitePoint Guru silver trophy Luke Redpath's Avatar
    Join Date
    Mar 2003
    Location
    London
    Posts
    794
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Also, the ID in the first hash is a string ("5") and its an integer in the second (5). Type differences have caught me out with URL/route assertions in the past. A good rule of thumb is to pick either a strings or integers for numbers in your URLs and stick to it (so if you are using strings, and you are redirecting in your controller using an ID field from your database, remember to put .to_s on the end of it).

  4. #4
    SitePoint Enthusiast Stevenwulf's Avatar
    Join Date
    May 2002
    Location
    Berkeley
    Posts
    76
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Thanks guys! Yeah, I finally noticed that the outputs didn't match. But even when they did match it still bombed because of the type mismatch on the id...thanks Luke.


Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •