Hi all,

I had this in my Dancer code:

  get '/instance/?:id?' => sub {
      my $id = param('id');
      ...
  };

That let's me do this:

  http://localhost:5000/instance      # get a list of instances
  http://localhost:5000/instance/     # get a list of instances

  http://localhost:5000/instance/213  # get instance 213


However, after I typoed a URL, I discovered that it would also match:

  http://localhost:5000/instances     # get instance 's'
 

This is because of the generated regex:

  /^\/instance\/?([^\/]+)?$/

I've fixed this by switching to regex paths, but I would argue for the 
following to be the regex generated from my example above:

  /^\/instance(?:\/([^\/]+))?$/


In other words, if you have multiple "optional" components in a path, they are 
all required up to, but excluding, the last optional component found in the URL 
that is accessed. You could then safely visit /instance, /instance/, and 
/instance/42.

This would allow the easy construction of things like this:

  /member/?:member_id?/?:tag_id?

Allowing you to access:

  /member
  /member/
  /member/3
  /member/3/
  /member/3/7

This would make it easy to write the sort of URLs that I often write.

Speculation: at that point, if we have an optional component, we could *assume* 
that the preceding / must be optional (?), leading to a simple URL:

  /member/:member_id?/:tag_id?

Once something optional is found, nothing after it may be mandatory (otherwise, 
if you had optional items collapsing out of the URL, it would be a semantic 
mess that's impossible to sort through).

Thoughts?

Cheers,
Ovid
--
Live and work overseas - http://www.overseas-exile.com/
Buy the book           - http://www.oreilly.com/catalog/perlhks/
Tech blog              - http://blogs.perl.org/users/ovid/
Twitter                - http://twitter.com/OvidPerl/
_______________________________________________
Dancer-users mailing list
[email protected]
http://www.backup-manager.org/cgi-bin/listinfo/dancer-users

Reply via email to