所以我有一条约束路径匹配路径,如下所示:
/jobs-in-London
get ':id' => 'search#show', :constraints => { :id => /jobs-in-[A-Z].*/ }
这很好用,但我需要匹配用其他字符集编写的位置,例如日语。我很高兴“job-in-”保留在英语中,因为有效的网址是由用户上传的地点列表生成的。
这意味着我希望匹配/jobs-in-東京
,然后一旦它击中控制器就会在东京搜索。地理位置稍后完成,无需翻译即可运行。我只需要向正确的控制器提出请求。
我试过这个:
get ':id' => 'search#show', :constraints => { :id => /jobs-in-\p{L}*/ }
我使用Rubular构建,它似乎正确匹配as seen here.我知道这没有大写字母约束,但这并不重要,因为有些语言似乎没有真正的资本不管怎么说。
然而路线与它不匹配,而是将它吐出到底部的通配符捕获。
我是否违反了Rails如何为路由实现正则表达式?它不支持unicode选择器吗?
我不能这样:
get ':id' => 'search#show', :constraints => { :id => /jobs-in-.*/ }
因为这与不受欢迎的/jobs-in-$£@
匹配,我想将其约束为“字母”字符。
答案 0 :(得分:1)
我希望匹配/foo/a
和/foo/ä
等路由,其中最后一位可以是非ASCII字母,例如“ä”。
在Rails 4.2上,我没有运气
get "foo/:letter" => "foos#bar", letter: %r{[[:alpha:]]}
或我试过的正则表达式的其他变体,但这很好用:
get "foo/:letter" => "foos#bar",
constraints: ->(request) {
# Matching with `letter: some_regex` did not work with åäö.
letter = request.path_parameters[:letter]
letter.match(/\A[[:alpha:]]\z/u)
}