Ruby Forum Ruby on Rails > The latest & greatest Routing (Rails Edge 4611)

Posted by Doug Dupory (doug)
on 01.08.2006 06:18
Got a quick question regarding the latest and greatest:

module ActionController
  module Routing
    SEPARATORS = %w( / ; . , ? )

Why is period (.) one of the separators? As it stands, the new routing 
code doesn't recognize 'file.ext' as the last component of a URL, which 
is sometimes defaulted to nil. See the generated code below.

I don't know everything about URL encoding, but it seems that period 
isn't one of should-be-escaped characters in a URL.

Thanks in advance!

Doug.

--Generated code--
  if (match = 
/\A\/(user)\/(login|logout|show|list)(?:\/?\Z|\/([^\/;.,?]+)\/?)\Z/.match(path))
Posted by Jeremy Kemper (Guest)
on 01.08.2006 06:31
(Received via mailing list)
On Jul 31, 2006, at 9:18 PM, Doug Dupory wrote:
> Got a quick question regarding the latest and greatest:
>
> module ActionController
>   module Routing
>     SEPARATORS = %w( / ; . , ? )
>
> Why is period (.) one of the separators? As it stands, the new routing
> code doesn't recognize 'file.ext' as the last component of a URL,  
> which
> is sometimes defaulted to nil. See the generated code below.


An extension is the natural way to specify a resource's mime type:
   /people/1.xml

So it's now parameterizable:
   map.connect '/:controller/:id.:format', :action =>
'show', :require => { :method => :get }

   class PeopleController ..
     def show
       # The :format param informs respond_to.
       respond_to do |wants|
         wants.html # renders the rhtml
         wants.xml  { render :xml => @person.to_xml }
       end
     end

   GET /people/1
   GET /people/1.html
   GET /people/1.xml

jeremy
Posted by Doug Dupory (doug)
on 01.08.2006 17:43
Thank you, Jeremy, for the clear explanation! Indeed, it's quite a 
useful feature.

However, the implementation of it has introduced a problem: a URL that's 
generated by the following route cannot be recognized by the same route.
  map.connect '/:controller/:action/:file', :defaults => (:file => nil}
Note that .:format isn't specified, and then the file segment contains a 
dot, but url_for doesn't escape the dot.

A bug?

Doug.

Jeremy Kemper wrote:
> 
> An extension is the natural way to specify a resource's mime type:
>    /people/1.xml
> 
> So it's now parameterizable:
>    map.connect '/:controller/:id.:format', :action =>
> 'show', :require => { :method => :get }
> 
>    class PeopleController ..
>      def show
>        # The :format param informs respond_to.
>        respond_to do |wants|
>          wants.html # renders the rhtml
>          wants.xml  { render :xml => @person.to_xml }
>        end
>      end
> 
>    GET /people/1
>    GET /people/1.html
>    GET /people/1.xml
> 
> jeremy