Cor*_* O. 2 routes ruby-on-rails period
我创建了一个路由加控制器,用于按照此处的说明在 ruby on rails 中执行动态 css:
http://www.misuse.org/science/2006/09/26/dynamic-css-in-ruby-on-rails/
考虑到较新版本的 ruby on rails 需要进行一些更改,但问题出在 routes.rb 条目上。原来的条目是这样的:
# dynamic CSS (stylesheets)
map.connect 'rcss/:rcssfile',
:controller => 'rcss',
:action => 'rcss'
Run Code Online (Sandbox Code Playgroud)
这不适用于较新版本的 RoR,我发现此解决方案有效:
# dynamic CSS (stylesheets)
map.connect 'rcss/:rcssfile.css',
:controller => 'rcss',
:action => 'rcss'
Run Code Online (Sandbox Code Playgroud)
然而,现在我很沮丧,因为我无法获得一个包罗万象的文件类型扩展处理程序。该请求必须具有 .css 扩展名。进一步玩弄它,我想出了这个:
# dynamic CSS (stylesheets)
map.connect 'rcss/:rcssfile.:format',
:controller => 'rcss',
:action => 'rcss'
Run Code Online (Sandbox Code Playgroud)
所以这要好得多。现在我可以请求一个以 .foobar 或其他任何内容结尾的文件,并将它与处理程序匹配。不是我一定会,但更多的是了解一切。
然后我尝试创建一个看起来像 "foo.net.rcss" 的文件。现在看来,第一个点把一切都搞砸了。“没有路由匹配 rcss/foo.net.css”。我的问题如下:
无论文件名中有多少个点,我如何匹配任何文件名和任何扩展名?
为什么第一个示例在更高的 RoR 版本中不起作用?
为什么多个点会搞砸比赛?
在此先感谢您的帮助。
- - - - 更新 - - - -
我正在使用 Rails 3.0.5 。根据更多研究,我可以将语法缩短为:
match 'rcss/:rcssfile', :to => 'rcss#rcss'
Run Code Online (Sandbox Code Playgroud)
这相当于第一个似乎不起作用的示例,但是使用此语法它会按预期工作。
match 'rcss/:rcssfile:.:format', :to => 'rcss#rcss'
Run Code Online (Sandbox Code Playgroud)
这也像我之前的示例 #3 一样工作,但是它仍然存在不匹配具有多个句点的文件的问题。
似乎标记标准的 ":paramater" 需要特别考虑句点字符。":parameter" 将匹配最多一个句点的路径,":parameter.:extension" 将匹配最多两个句点的路径,但 :extension 将仅匹配两个句点之间的路径,等等。
解决这个问题的一种方法是使用所谓的“Route Globbing”,它使用星号而不是冒号:
match 'rcss/*rcssfile', :to => 'rcss#rcss'
Run Code Online (Sandbox Code Playgroud)
唯一需要注意的是,这将匹配星号之后的任何内容,包括子目录。因此,您要确保这不会意外暴露任何安全文件或无意中意外呈现内容。
| 归档时间: |
|
| 查看次数: |
4188 次 |
| 最近记录: |