2013-05-26 13 views
1

我需要讓路由匹配以下四種格式:需要使用的Z Rails的路由約束正則表達式,但得到一個錯誤

  • foo.json
  • foo.bar
  • foo.bar.json

如果路由與「以.json」結束,就在該部分應匹配,所以對於那些四個例子的唯一可能的匹配會是「foo」和「foo.bar」。

我想出了以下正則表達式:/.*?(?=\.json|\Z)/,但它不工作,由於Rails不允許你在一個路由約束使用\Z

正則表達式錨字符不允許在路由需求:/.*?(?=\.json|\Z)/

有沒有辦法繞過這個或另一個正則表達式我可以使用?

+0

做了'.json'可選..'?(?:\。JSON)' –

+0

@LeeJarvis將是什麼樣子作爲一個完整的正則表達式?我無法讓它工作。 –

+0

@RossPenman你的意思是[this](http://rubular.com/r/veo8DawTmI)? – HamZa

回答

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: /.*?/ } 
0

您需要限制不是網址,但只能格式化是這樣的:

get 'foo', format: /bar|json|bar\.json/, to: 'main#foo' 

格式將在控制器可作爲params[:format]

+0

我不想限制格式,我試圖匹配.json之前的所有內容。 .bar不是格式。 –

+0

你在第一段寫了「四種格式」 - 我不理解你。好的,我有解決方案,我會給它作爲另一個答案。 – MikDiet

1

下面的正則表達式匹配整個字符串,僅捕捉您需要的部分

(.*?)(?:\.json)?$ 

http://regex101.com/r/sM6rD0

此正則表達式匹配和捕捉只有部分需要

^((?:.(?!\.json$))*(?:$|.)) 

http://rubular.com/r/SdtEDiWPRX

第二個正則表達式是過於複雜,雖然我很懷疑你需要你的比賽,你的捕捉是完全一樣的。不過話又說回來,我不知道很多關於軌道:)

+0

我需要表達式的結果不包含.json,而且這個包含了。這與之前的部分匹配,但Rails沒有考慮到這一點。它只使用像「foo.bar.json」這樣的字符串。 –

+0

它不應捕獲.json,因爲捕獲組以?:開頭。這應該工作:嘗試一下。 –

+0

我已經添加了一個工作示例的鏈接。 –

0

,如果你想獲得任意鍵這不是那麼瑣碎,:

get ":foo(.:bar)", to: 'main#foo', bar: /(?!json$|html$)[^\.]*/ 

有一件事你應該關注,是:bar不能json (或任何其它適當的格式)

在你控制器,你將有params[:foo]params[:bar]

+0

對不起,如果我不清楚,但富和酒吧都是任意字符串。我真正想要做的是匹配和字符串之前.json,這是一個可選的令牌,而不使用錨點。 –

+0

好吧,我更新我的答案任意'foo'和'bar' – MikDiet