我需要允许路由匹配以下四种格式:
如果路线以“.json”结尾,那么之前的部分应该匹配,因此这四个示例的唯一可能匹配是“foo”和“foo.bar”。
我提出了以下正则表达式:/.*?(?=\.json|\Z)/
,但它不起作用,因为Rails不允许您在路由约束中使用\Z
:
路由要求中不允许使用正则表达式锚点字符:
/.*?(?=\.json|\Z)/
我可以使用这个或另一个正则表达式吗?
答案 0 :(得分:1)
以下正则表达式将匹配整个字符串并仅捕获您需要的部分
(.*?)(?:\.json)?$
此正则表达式将匹配并仅捕获您需要的部分
^((?:.(?!\.json$))*(?:$|.))
http://rubular.com/r/SdtEDiWPRX
第二个正则表达式过于复杂,我非常怀疑你需要你的匹配和你的捕获是完全一样的。但话说回来,我对rails不太了解。)
答案 1 :(得分:1)
您应该能够创建自己的定义.matches的对象吗?方法。结合@ mrhobo的正则表达式应该可行。
http://guides.rubyonrails.org/routing.html#advanced-constraints
答案 2 :(得分:0)
您需要限制不是网址,但只能以这种方式格式化:
get 'foo', format: /bar|json|bar\.json/, to: 'main#foo'
格式将在控制器中以params[:format]
答案 3 :(得分:0)
如果你想获得任意键,那不是那么简单:
get ":foo(.:bar)", to: 'main#foo', bar: /(?!json$|html$)[^\.]*/
您应该关注的一点是:bar
不能是json
(或任何其他适当的格式)
在您的控制器中,您将拥有params[:foo]
和params[:bar]
答案 4 :(得分:0)
我最终做的是创建两个不同的路由,一个路由端有JSON,另一个路径没有,两个路由都使用不同的正则表达式。所以以前的路线看起来像这样。
get ':foo', to: 'foo#bar', constraints: { foo: /.*?(?=\.json|\Z)/ }
现在看起来像这样:
get ':foo.json', to: 'foo#bar', constraints: { foo: /.*?(?=\.json)/ }, format: :json
get ':foo', to: 'foo#bar', constraints: { foo: /.*?/ }