Rails路由捕获除资产之外的所有内容

时间:2012-06-26 15:40:02

标签: ruby-on-rails-3

我正在尝试允许管理员在根路径上创建页面。到目前为止我有:

get ':path' => "pages#show" ,:as =>:page, :path => /[^\.]+/

基本上我试图忽略所有带有点的路径(如.png)。这似乎不起作用,因为一切都被拒绝(我只希望拒绝公共目录中的东西,如字体,图标,图像......)

由于

2 个答案:

答案 0 :(得分:4)

正如我在上面的评论中所解释的那样,“如果所需的资产不存在,那么公共场所中的所有内容都是由网络服务器直接呈现的”。这将导致您的全能路线捕捉到这种不良副作用。正如我解释的那样,这可能会导致许多问题。因此,需要一个特定的全能路线来弥补这一点:

get ':path' => "pages#show", :as => :page, :constraints => lambda{|req| req.path !~ /\.(png|jpg|js|css)$/ }

你可以操纵正则表达式,但是你的目标只是通过向你展示你可以将一个块传递给:constraints选项来让你走上正确的轨道。此外,我不仅测试req.format,因为这将排除带有js格式的头信息的请求,并且会导致catch对所有这些类型的请求都不起作用(不是通常情况下的全能,但这是无关紧要的) )。通过使用req.path,标题信息保持不变/正常,并且路径指示此请求是否被此路由捕获。

我希望这会对你有所帮助。

测试: 要测试以查看您的所有内容是否实际捕获了您想要的内容而不是其他公共资源,请按照以下步骤操作。首先在您的PagesController中将调试器放入catch-all操作中。然后向一个存在的公共文件png / js / css文件发出请求,比如localhost:3000 / images / example_image.png,它不应该像往常一样点击你的全部。现在,将路径更改为不存在的图像localhost:3000 / images / no_image.png。如果请求没有到达您的调试器,那么您的catch-all不会捕获图像文件请求和您的ALL SET。如果请求确实命中了调试器,那意味着你的catch-all正在捕获图像文件请求,这意味着你需要修改你的全部限制。

答案 1 :(得分:3)

  

默认情况下,动态细分不接受点 - 这是因为   dot用作格式化路由的分隔符。如果你需要使用   动态细分中的点添加一个覆盖此约束的约束 -   例如:id => / [^ /] + /允许除斜杠之外的任何东西。

http://guides.rubyonrails.org/routing.html#bound-parameters

所以只是删除条件有效。但是,这个问题可能还有另一个更好的解决方案。