のようなルートを処理する必要があり/:slug
ます。スラッグは他の場所で一致するように制約されています。
\A[\p{Alnum}_.-]{3,}\z
明白なルート:
get '/:slug' => '...', :constraints => { :slug => /[\p{Alnum}_.-]{3,}/ }
get '/:slug' => '...', :slug => /[\p{Alnum}_.-]{3,}/
/mu-is-too-short
andのような ASCII URL では問題なく動作/where.is.pancakes.house
しますが、URL が の場合、すべてがうまくいきません/µ-is-too-short
。ブラウザはこれをサーバーに送信しています:
/%C2%B5-is-too-short
%C2%B5-is-too-short
Rails はエンコードされた を制約に対してチェックしようとしていますが、が ではない:slug
ため失敗しています。%
\p{Alnum}
私は2つのクラッジを思いつきました:
get '/:slug' => '...', :slug => /.{3,}/
get '/:slug' => '...', :slug => /[^\/]+/, :constraints => lambda { |r| r.path_parameters[:slug].to_s =~ /\A[\p{Alnum}_.-]{3,}\z/ }
2 番目の:slug => /[^\/]+/
in は、Rails が.b
ina.b
をフォーマット拡張と見なさないようにするために必要です。
Rails を賢明に動作させ、デコードされ:slug
たものを制約に対してチェックする方法はありますか、それとも制約を緩めるか手動で行う必要がありますか?