Rails 3路由扩展正则表达式:约束 - 错误?

时间:2010-10-04 09:38:24

标签: regex ruby-on-rails-3 routes

我的Rails 3应用程序中有以下路径。

post 'games/:id/:task/:card_id' => 'games#perform', :as => :perform

...显然允许button_to("Foo", {card_id=>2, :action=>:perform, :task=>"foo"})等请求映射到网址/games/1/foo/2

我想限制路线匹配的任务集。 Rails API docs表示“约束可以包括'ignorecase'和'扩展语法'正则表达式修饰符”。但是,以下工作符合预期:

post 'games/:id/:task/:card_id' => 'games#perform', :as => :perform, :constraints => {:task => /(foo|bar)/}

但以下情况并非如此:

post 'games/:id/:task/:card_id' => 'games#perform', :as => :perform, :constraints => {:task => /(foo|
                                                                                                 bar)/x}

在后一种情况下,上面的button_to链接会生成以下网址:/games/perform?card_id=2&task=foo

这是一个错误,还是我做错了什么?

1 个答案:

答案 0 :(得分:1)

是的,Ruby 1.8.x的RegexpWithNamedGroups处理中存在一个错误,因为它以与regexp修饰符不兼容的方式伪造了命名的regexp groups语法1.9。

这里的问题是,1.8 Rails使用regexp中的paren组的简单索引来映射到名称。向正则表达式添加修饰符时,会在内部创建一个附加组,该索引将索引抛出一个。

现在解决方法是使用1.9或不使用修饰符。