Ruby on rails 3 Rails可以捕获除资产以外的所有内容

Ruby on rails 3 Rails可以捕获除资产以外的所有内容,ruby-on-rails-3,Ruby On Rails 3,我正在尝试允许管理员在根路径上创建页面。到目前为止,我已经: get ':path' => "pages#show" ,:as =>:page, :path => /[^\.]+/ 基本上,我试图忽略所有带有点的路径(如.png)。这似乎不起作用,因为所有内容都被拒绝(我只希望公用目录中的内容被拒绝,如字体、图标、图像..) 谢谢 默认情况下,动态线段不接受点–这是因为 点用作格式化路由的分隔符。如果您需要使用 动态线段内的点添加一个覆盖此点的约束—— 例如:id=>/[^/

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

get ':path' => "pages#show" ,:as =>:page, :path => /[^\.]+/
基本上,我试图忽略所有带有点的路径(如.png)。这似乎不起作用,因为所有内容都被拒绝(我只希望公用目录中的内容被拒绝,如字体、图标、图像..)

谢谢

默认情况下,动态线段不接受点–这是因为 点用作格式化路由的分隔符。如果您需要使用 动态线段内的点添加一个覆盖此点的约束—— 例如:id=>/[^/]+/允许除斜杠以外的任何内容


因此,只需去除条件就行了。不过,对于这个问题可能还有另一个更好的解决方案。

正如我在上面的评论中所解释的,如果所需的资产不存在,“公开的一切都是由Web服务器直接呈现的”,这是不正确的。这将导致您的“一网打尽”路线捕捉到这种不希望出现的副作用。正如我所解释的,这可能会导致许多问题。因此,需要一条特定的全包路线来补偿这一点:

get ':path' => "pages#show", :as => :page, :constraints => lambda{|req| req.path !~ /\.(png|jpg|js|css)$/ }
你可以在你认为合适的任何时候操纵正则表达式,因为我的目标只是通过向你展示你可以将一个块传递给:constraints选项,让你走上正确的轨道。另外,我并没有仅仅测试req.format,因为这将排除带有js格式头信息的请求,并将导致catch-all不适用于这些类型的请求(不是catch-all的常见情况,但这与此无关)。通过使用req.path,报头信息保持不变/正常工作,路径指示此路由是否捕获此请求

我希望这对你有帮助

测试:
要测试您的“一网打尽”是否真正捕获了您想要的内容,而不是额外的公共资源,请执行以下步骤。首先将调试器放在页面控制器中的“全面捕获”操作中。然后请求一个确实存在的公共文件png/js/css文件,比如localhost:3000/images/example_image.png,它不应该像往常一样满足您的要求。现在,将路径更改为不存在的图像,localhost:3000/images/no_image.png。如果请求未命中调试器,则“全部捕获”不会捕获图像文件请求,并且“全部”已设置。如果请求确实命中了调试器,这意味着您的“全部捕获”正在捕获图像文件请求,这意味着您需要修改“全部捕获”中的约束。

您不能这样做-所有公开的内容都是由Web服务器直接呈现的-它不会命中Rails堆栈。啊,好的,所以我一直在寻找没有问题的地方。很高兴知道,thanks@sethvargo,如果所需资源的路径不存在,则不存在这种情况,并且可能会导致巨大的问题。例如:您在rails应用程序中使用js插件,例如.ckeditor,它会从资产文件夹中加载其他脚本。这个插件试图加载一个由于任何原因而未预编译的js资产。现在,它不会优雅地失败,而是会击中您的rails堆栈,并击中您的全面路线。“一网打尽”应该首先防止这种路由发生。下面是我的答案。你可以使用
a!~/b/
而不是
!(a=~/b/)
@trushkevich尽管我很喜欢ruby作为一种语言如何将绝大多数基本的编码原则抽象为“一行程序”,加上语法上的甜点,但我仍然相信“可读性”胜过短小。这是
a!~/b/
在我心目中是不可读的。同样,这是个人的偏好,1.)不会影响代码的结果,2.)不会(在我看来)提高可读性,3.)除了“嘿,看!ruby可以让事情变得更短@你说的是真的吗<代码>~在ruby中是相当标准的,你所写的我可以和写
相比!(a==b)
而不是
a!=b
。这太奇怪了。我不想争论哪种简单代码行的排列方式更好,正如我刚才所说的——偏好就是偏好。我最初的回答是试图强调一点,即我们正在寻找正则表达式的反面。如果你真的对自己的偏好有那么强烈的感觉,欢迎你编辑我的帖子:)