我的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
。
这是一个错误,还是我做错了什么?
答案 0 :(得分:1)
是的,Ruby 1.8.x的RegexpWithNamedGroups
处理中存在一个错误,因为它以与regexp修饰符不兼容的方式伪造了命名的regexp groups语法1.9。
这里的问题是,1.8 Rails使用regexp中的paren组的简单索引来映射到名称。向正则表达式添加修饰符时,会在内部创建一个附加组,该索引将索引抛出一个。
现在解决方法是使用1.9或不使用修饰符。