路由正则表达式约束与Rails 4中的子组无法正常工作

时间:2014-11-04 21:58:21

标签: ruby-on-rails regex routes

我有以下约束:

get '/:name' => "products#show", :as => :product, :constraints => {name: /\w+(-\w+)*/}

以下网址:

/aa--aa

将返回No route matches [GET] "/aa--aa"

但如果我/\w+(-\w+)*/.match('aa--aa'),我将获得一个MatchData对象。那么,Rails如何处理Regex约束呢?为什么这与.match不一致?

2 个答案:

答案 0 :(得分:1)

Rails将嵌入你的约束:

/\A#{tests[key]}\Z/ === parts[key]

请参阅:formatter

这就是为什么它不会通过。

答案 1 :(得分:0)

^\w+(-\w+)*$正则表达式无法匹配aa--aa,因为短划线需要用单词分隔。

我不了解Ruby,但我认为^$隐含在您的约束中,我猜你会得到aa子串的结果因为不再暗示锚(我在这里可能完全错了)。

我建议采用以下模式:

\w+(?:-+\w+)*

我刚刚在短划线中添加了+量词,并使该组无法捕捉。