ruby on rails – routes.rb – 当文件名中存在多个句点时匹配文件扩展名

我已经根据这里的说明创建了一个路由加控制器,用于在rails上的ruby中执行动态css:

http://www.misuse.org/science/2006/09/26/dynamic-css-in-ruby-on-rails/

需要一些更改才能在rails上考虑更新版本的ruby,但问题在于routes.rb条目。 原来的条目是这样的:

# dynamic CSS (stylesheets) map.connect 'rcss/:rcssfile', :controller => 'rcss', :action => 'rcss' 

这不适用于较新版本的RoR,我发现这个解决方案有效:

  # dynamic CSS (stylesheets) map.connect 'rcss/:rcssfile.css', :controller => 'rcss', :action => 'rcss' 

但是,现在我感到很遗憾,我无法获得一个catch-all文件类型扩展处理程序。 请求必须具有.css扩展名。 进一步玩弄它我想出了这个:

  # dynamic CSS (stylesheets) map.connect 'rcss/:rcssfile.:format', :controller => 'rcss', :action => 'rcss' 

所以这要好得多。 现在,我可以请求以.foobar或其他任何forms结束的文件,并将其与处理程序进行匹配。 不是我必然,但更多的是理解一切。

所以我尝试创建一个类似“foo.net.rcss”的文件。 现在似乎第一个点弄乱了一切。 “没有路线匹配rcss / foo.net.css”。 我的问题如下:

  1. 无论文件名中有多少个点,我如何匹配任何文件名和任何扩展名?

  2. 为什么第一个示例在以后的RoR版本中不起作用?

  3. 为什么多个点搞砸了比赛?

在此先感谢您的帮助。

——-更新——-

我正在使用Rails 3.0.5。 根据更多的研究,我可以缩短语法:

 match 'rcss/:rcssfile', :to => 'rcss#rcss' 

这相当于第一个似乎不起作用的示例,但是使用此语法它可以正常工作。

 match 'rcss/:rcssfile:.:format', :to => 'rcss#rcss' 

这也像我之前的示例#3一样工作,但它仍然存在不匹配多个句点的文件的问题。

似乎标注标准“:参数”需要特别考虑时期特征。 “:parameter”将匹配最多一个句点的路径,“:parameter。:extension”将匹配最多两个句点的路径,但:extension将只是两个句点之间的内容,等等。

解决这个问题的方法是使用所谓的“Route Globbing”,它使用星号而不是冒号:

 match 'rcss/*rcssfile', :to => 'rcss#rcss' 

唯一需要注意的是,这将与星号后的任何内容相匹配,包括子目录。 因此,您希望确保这不会意外地暴露任何安全文件或意外地无意中呈现内容。

使用正则表达式匹配文件名?

 map.connect 'rcss/:rcssfile', :controller => 'rcss', :action => 'rcss', :requirements => {:rcssfile => /.+\.rcss/ } 

这将匹配(任何).rcss – 您可以调整各种后缀的正则表达式。

当您不知道扩展时,我将此用于一般情况:

 get '/uploads/:basename.:extenstion', to: 'controller#action', basename: /.*(?=\.[\w\d]+$)/