【发布时间】:2012-10-02 14:30:34
【问题描述】:
我想匹配所有以/company/开头的网址,所以我有这个路由:
match '/*id' => 'high_voltage/pages#show', :constraints => { id: /^company\/.*/ }
但是约束没有做任何事情。 URL /abc 也匹配此路由,PagesController 会引发错误。
我应该如何指定这个?
我需要id参数在开头包含company/,所以请不要说只做路由match '/company/*id'。这将为控制器提供一个 id 参数,而没有 company/。
更新:我确实在普通的 Ruby 中尝试了上面的正则表达式,它可以工作。我也试过没有 ^ 在公司前面(虽然我确实需要公司作为第一个词),但没有运气。
更新 2:问题似乎出在通配符上,通配符路由是否适用于约束?当路由中有通配符时,我无法让任何约束起作用。
更新 3:原来这只是一个 bug in Ruby on Rails。
【问题讨论】:
-
为什么id参数里面需要
/company? -
@RyanBigg - id 需要
company(前面没有 /)的原因是 thinkbot 的高压 gem 的工作原理。 id 需要完整路径。 -
一个(潜在的)问题是您不能在路由约束中锚定正则表达式。 Rails 应该在遇到
^时给你一个错误。诚实地?在研究高压后,我会把那颗宝石扔掉。它对您的作用如此 很少,因此不值得破坏您的路由表以使其正常工作。 Rails 已经让静态页面变得非常、非常简单了。 -
创建
PagesController,添加get "pages/:action" => "pages#action",您已经完成了 Gem 提供的所有功能。 -
作为最后一点,不要混合旧/新哈希语法...
constraints: { id: /^company\/.*/ }而不是:constraints =>...
标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 routes