2011-03-21 38 views
1

存在我已经创建了Ruby on Rails中做动态CSS按照这里的指示路线Plus控制器:红宝石 - 的routes.rb - 匹配的文件扩展名,当多个周期中的文件名

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' 

这并没有与回报率较新版本的工作,我发现这个解决方案的工作:

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

不过,现在我也很失望,我不能获得一个全面的文件类型扩展处理程序。该请求必须具有.css扩展名。进一步玩弄我想出了这个:

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

所以这是好得多。现在我可以请求一个以.foobar或其他方式结尾的文件,并将其与处理程序匹配。不是我一定会,但更多的是理解一切。

那么我试着创建一个看起来像“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一样工作,但是它仍然存在不匹配具有多个句点的文件的问题。

回答

4

看起来标签标准“:paramater”需要特别考虑期间字符。 “:参数”将匹配最多一个句点的路径“,:参数。:扩展名”将匹配具有最多两个句点的路径,但是:扩展名将只是两个句点之间的内容等。

解决的办法是使用所谓的“路线通配”,它使用的,而不是一个冒号星号:

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

唯一需要注意的是,这将星号,包括子目录后匹配任何。因此,您要确保这不会意外暴露任何安全文件或意外地无意中渲染事物。

+1

我曾尝试过使用这种方法,但发现'params [:rcssfile]'不包含文件扩展名。因此,浏览到'rcss/main.css'结束发送''main''作为参数,剥离''.css''扩展名。 – CodingWithSpike 2016-03-02 16:12:50

1

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

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

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

+0

嗨燕姿,感谢您的答复。我正在寻找一些与/rcss/(any_filename).(any_extension)相匹配的东西,而不仅仅是一个扩展。需要注意的是(any_filename)可能有多个句点/点,并且(any_extension)会在最后一个点之后(如果存在)。 – 2011-03-21 22:38:52

+0

:需求是你需要的一点 - 只要将正则表达式改为任何你想要的 - 例如。 '/ *'会匹配任何东西 – stef 2011-03-23 22:48:16

+0

嗨Stef,:需求是我需要的关于如何将正则表达式匹配添加到路由中的缺失部分。在您指出之后,我能够发现更多关于高级路由的知识。不过,看看我在该帖子中的第三个实例。你可以看到它给出了可以在控制器中访问的文件名和文件扩展名(rcssfile和:格式)(只要只有一个句点)。有没有办法使用:要求来帮助实现这一目标并解决多期问题?这是我无法弄清的最后一部分。 – 2011-03-24 22:49:28

0

我用这对一般情况下,当你不知道分机:

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