2016-04-07 10 views
1

に一致しない:Railsのルートの制約 - Unicodeの正規表現は、だから私は、次のようなパスに一致する制約のルートを持っている

/jobs-in-London 
get ':id' => 'search#show', :constraints => { :id => /jobs-in-[A-Z].*/ } 

これは素晴らしい作品が、私は他の文字セットで書かれた場所に一致させる必要があります、日本人など。有効なURLはユーザーがアップロードした場所の一覧から生成されるため、「jobs-in」は英語で残っています。

これは私が/jobs-in-東京と一致することを期待していることを意味します。それはコントローラにヒットした後東京で検索します。ジオロケーションは後で実行され、翻訳なしで動作します。私はちょうど右のコントローラに要求を取得する必要があります。

私はこの試みている:私はRubularを使用して構築し、私はこれが大文字の制約を持っていない承知していますが、それはいくつかのように重要ではありません正しくas seen here.に一致するように見える

get ':id' => 'search#show', :constraints => { :id => /jobs-in-\p{L}*/ } 

とにかく本当の大文字を持っているようには見えません。

しかし、ルートはそれにマッチしません。代わりに、ワイルドカードキャッチにそのルートを吐き出してください。

私は、Railsがルートの正規表現をどのように実装しているのか悪化していますか?ユニコードセレクタはサポートしていませんか?私は、このことはできません

:これは望ましくない/jobs-in-$£@に一致するよう

get ':id' => 'search#show', :constraints => { :id => /jobs-in-.*/ } 

を、私は「手紙」の文字にそれを制限したいです。

+0

てみてください: 'ジョブ・インを\ p {Lu} \ p {M} * +。* '(' \ p {Lu} 'は大文字のUnicode文字と一致します)。 '[A-Z]。*' - >は、大文字のASCII文字の後に改行以外の0+の文字が続くものと一致します。したがって、 '\ p {Lu} \ p {M} * +'は1文字(あらかじめ作成されたもの)に続いて同じ '。*'とマッチします。大文字でも大文字でもない場合は 'jobs-in \ p {L} \ p {M} * +。*'だけです。 –

+0

この場合も、これはrubularでマッチしますが、ルートに追加すると実際には一致しません。 – MWvolcanic

答えて

0

/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) 
    } 
関連する問題