我正在尝试允许管理员在根路径上创建页面。到目前为止,我有:
get ':path' => "pages#show" ,:as =>:page, :path => /[^\.]+/
基本上我试图忽略所有带有点的路径(如.png)。这似乎不起作用,因为一切都被拒绝了(我只希望公共目录中的东西被拒绝,比如字体、图标、图像..)
谢谢
我正在尝试允许管理员在根路径上创建页面。到目前为止,我有:
get ':path' => "pages#show" ,:as =>:page, :path => /[^\.]+/
基本上我试图忽略所有带有点的路径(如.png)。这似乎不起作用,因为一切都被拒绝了(我只希望公共目录中的东西被拒绝,比如字体、图标、图像..)
谢谢
正如我在上面的评论中解释的那样,如果所需的资产不存在,“公共的一切都是由网络服务器直接呈现的”是不正确的。这将导致你的包罗万象的路线捕捉到这种不受欢迎的副作用。正如我所解释的,这可能会导致许多问题。因此,需要一个特定的包罗万象的路线来弥补这一点:
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 代替,标头信息保持不变/工作,并且路径指示此请求是否被此路由捕获。
我希望这可以帮助你。
测试:要测试你的包罗万象是否真的捕捉到你想要的而不是额外的公共资源,请按照以下步骤操作。首先在 PagesController 中的 catch-all 操作中放置一个调试器。然后向确实存在的公共文件 png/js/css 文件发出请求,例如 localhost:3000/images/example_image.png,它不应该像往常一样击中你的全部内容。现在,将路径更改为不存在的图像, localhost:3000/images/no_image.png 。如果请求没有命中你的调试器,你的 catch-all 没有捕捉到图像文件请求,你的 ALL SET. 如果请求确实命中了您的调试器,则意味着您的 catch-all 正在捕获图像文件请求,这意味着您需要修改 catch-all 中的约束。
默认情况下,动态段不接受点——这是因为点被用作格式化路线的分隔符。如果您需要在动态段中使用点,请添加一个覆盖它的约束——例如 :id => /[^/]+/ 允许除斜杠之外的任何内容。
http://guides.rubyonrails.org/routing.html#bound-parameters
因此,只需删除条件即可。不过,这个问题可能还有另一个更好的解决方案。