【发布时间】:2021-10-16 09:06:31
【问题描述】:
我最初有这样定义的路线:
get ':foo(/:bar)/:baz(/:qux)/:slug', to: 'application#show', constraints: { baz: /.+?\-\d+/ }, as: test
使用此配置,如果我在路径中省略 :bar,它可以正常工作:
foo/baz-123/qux-quux/test
控制器返回以下参数:{foo: 'foo', baz: 'baz-123', qux: 'qux-quux', slug: 'test'}
现在,规格发生了变化,我需要在 baz 约束中接受字母数字字符,所以我这样做了:
get ':foo(/:bar)/:baz(/:qux)/:slug', to: 'application#show', constraints: { baz: /.+?\-[a-z0-9]+/ }, as: test
使用此配置,参数映射开始表现不同。同一路径foo/baz-123/qux-quux/test在控制器中返回如下参数:
{foo: 'foo', bar: 'baz-123', baz: 'qux-quux', slug: 'test'}
我认为这是因为qux-quux 也匹配约束,所以我将其更改为/.+?\-(?=.*\d+)[a-z0-9]+/ 以确保:baz 参数在- 之后的第二部分中至少需要一位数字。
但是,即使qux-quxx 与约束不匹配,控制器仍会返回相同的错误映射。
Rails 如何在多个可选段的情况下映射参数?
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-5 rails-routing