Rails路由约束 - unicode正则表达式不匹配

时间:2016-04-07 11:42:05

标签: ruby-on-rails regex ruby-on-rails-4

所以我有一条约束路径匹配路径,如下所示:

/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-$£@匹配,我想将其约束为“字母”字符。

1 个答案:

答案 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)
  }